Silverlight call WCF(tcp) self host 實作

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  如下


      <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 。