我已經在C#.NET中開發了一個Web和Windows應用程序。現在,我想要做的是當在Web應用程序的特定頁面上單擊按鈕時,必須將信號發送到Windows應用程序,並指出鏈接已被點擊。我怎麼能很容易地做到這一點?我想遠離套接字編程...如何讓我的Web應用程序與我的桌面應用程序通信?
我想到了網絡應用程序存儲cookie和監控cookie文件夾的桌面應用程序,但似乎有點笨拙。
我已經在C#.NET中開發了一個Web和Windows應用程序。現在,我想要做的是當在Web應用程序的特定頁面上單擊按鈕時,必須將信號發送到Windows應用程序,並指出鏈接已被點擊。我怎麼能很容易地做到這一點?我想遠離套接字編程...如何讓我的Web應用程序與我的桌面應用程序通信?
我想到了網絡應用程序存儲cookie和監控cookie文件夾的桌面應用程序,但似乎有點笨拙。
桌面應用程序可以通過普通的http輪詢web應用程序,但打開連接可能會更好。你也可以使用.NET Remoting或WCF這樣的東西來啓用IPC的通信。
您還可以查看IPC的命名管道。
您可以使用.NET遠程處理來執行此類任務。這意味着桌面客戶端必須啓動.NET遠程服務器,以便Web服務器可以調用桌面客戶端的方法。
但這可能會帶來安全風險。此外,路由器或防火牆可能會阻止對客戶端的訪問。也許最好使用輪詢,即桌面客戶端定期查詢服務器以查找新事件。爲此,一個簡單的REST-API就足夠了,儘管在這裏也可以使用.NET Remoting(以及SOAP或CORBA)。
可能與cookie想法同樣笨拙,但是web應用程序可以存儲關於點擊鏈接的信息(何時,由誰控制頁面上的值等)並將其存儲在客戶端的數據庫中應用程序會定期輪詢。
一個簡單的網絡服務應該做的伎倆。只需在ASP.NET中創建一個服務並將其添加爲您的桌面應用程序的參考。沒有必要爲了完成這樣一個簡單的任務而浪費精力。
你可以使用WCF或Remoting或套接字 - 爲什麼浪費時間,當學習曲線如此之高?創建Web服務將不會花時間,並且應該爲您提供所需的所有功能。
下面是一個簡短的演練,讓你啓動並運行。
將創建一個稱爲HelloWorld的存根方法,例如
[的WebMethod]
公共字符串的HelloWorld(){
return "Hello World";
}
運行您的網站。
**請記住,爲了讓您擁有靜態URL的Web引用,您需要在IIS中託管引用。當Visual Studio通過IDE運行您的服務時,它將創建一個臨時URL和端口,這將在未來的運行中發生變化。這只是爲了向您展示使用Web服務的簡單方法。
通過在方法上添加[WebMethod]標誌,您可以添加自己的方法並返回與HelloWorld方法相同的類中的類型。如果您在服務中更改某些內容,請返回桌面應用程序,右鍵單擊該服務,然後單擊更新。
讓您的Windows應用程序擁有自託管的Web服務,並在用戶單擊按鈕時從您的Web應用程序調用此Web服務。見例如here關於如何做到這一點。這是非常簡單的方式,imho。 (你不需要套接字......好吧,這個解決方案中有深埋的套接字,但是到目前爲止建議的所有解決方案都存在,一部分來自命名管道和共享文件,但它們都嚴重無論如何,你不會被這些插座困擾,它們由框架照顧,無後顧之憂。)
與往常一樣,有不止一種方法來使貓變皮。這是我的承諾。
如果你並不需要即時響應,但需要的可擴展性,以支持桌面客戶端
點擊可以簡單地表現爲在「命令總線」的事件很多(讀:event aggregator)。命令總線中的項目通過Web服務公開。 桌面應用程序可以簡單地通過輪詢Web服務來「觀察」命令總線,如果有一個新的「命令」,它以前沒有見過。
對於.Net可能使用Reactive Extension可以在這裏幫助。該網站公開的IObservable和桌面客戶端成爲IObserver
如果你需要更多的瞬時響應,但只有有限的桌面客戶端的數量,以及每個客戶端具有永久的IP地址在
主機WCF服務桌面客戶端。將net tcp綁定到公共ip地址(例如,net.tcp://xxx.xxx.xxx.xxx:8523/Service1)。當用戶點擊網站上的一個按鈕時,網站會發送一個請求到桌面客戶端託管的wcf服務。這個細節對我來說很模糊,但似乎是一個合乎邏輯的方法。
如果你需要更多的瞬時響應,但只有有限的桌面客戶端的數量,以及每個客戶端沒有永久的IP地址,並願意爲雲服務 這裏就是一個Azure的服務總線可能出現派上用場。每次用戶點擊一個鏈接時,都會將消息推送到Azure服務總線。每個桌面客戶端都可以訂閱Azure服務總線中的事件。這裏是一個例子Azure service
嗨,請給我更詳細的信息,告訴我如何通過Web服務實現這一點?當然聽起來像一個有吸引力的想法... – Romulus 2010-08-03 13:56:20