Silverlight call WCF(tcp) self host 實作

Silverlight 呼叫 WCF 服務時,會先連結服務主機 PORT:80 上,檢查 clientaccesspolicy.xml 上
的 crossdm domain 規定,若是將 WCF 服務部署在 Web server 上,只要建立一個實體檔案置於對應的目錄上就完成了。

但是,若是以Windows Form 或 Console 應用程式啟動服務時,clientaccesspolicy.xml 要如何
讓 Silverlight 找到?

答案就在這篇文章中 : Enabling cross-domain calls for SL apps on self-hosted TCP services

解決方案

1. 新增一個介面與方法,在方法上加 Attribute
[OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]

2. WCF 服務實作上述介面,輸出 clientaccesspolicy.xml 的內容

3. 服務啟動時增加一個 endpoint,筆者將設定內容置於 App.config  如下

    <services>
<service name="WcfHttp_Tcp.Service1">
<endpoint address="" behaviorConfiguration="webBehavior" binding="webHttpBinding"
bindingConfiguration="" contract="WcfHttp_Tcp.ITcpPolicyRetriever" />
<endpoint address="" behaviorConfiguration="" binding="netTcpBinding"
bindingConfiguration="NewBinding0" contract="WcfHttp_Tcp.IService1" />
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:80/" />
<add baseAddress="net.tcp://localhost:4504/" />
</baseAddresses>
</host>
</service>
</services>


第 3~4 行增加一個 endpoint,合約指定新增的介面



第 10 行增加一個網址必須是主機名稱的 80 PORT



 



依據原作者程式碼,實作上還是遇到一些小麻煩,筆記如下:



1. Silverlight 呼叫 WCF服務預設 PORT區段是 4502 ~ 4534 ,請參閱: Policy file for NetTcp



2. 須要用 [以系統管理者身份執行] 開啟 Visual Studio ,否則 WCF 服務 Self host 無法啟動 HTTP 模式



3. 發行的 Self host 應用程式,也須要 [以系統管理者身份執行]



 



原始碼下載



這是以 VS2010  開發,Windows Form host WCF,Silverlight 4 做為 Client 。