2011-01-21 59 views
3

我們的Silverlight應用程序可以在兩個HTTPHTTPS運行(SSL,使用運輸安全)模式。在我們的ServiceReferences.ClientConfig文件,我們只是配置了服務端點是這樣的:Silverlight中自動選擇之間的HTTP和HTTPS安全傳輸模式

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="DefaultEndpoint" 
       maxBufferSize="2147483647" 
       maxReceivedMessageSize="2147483647"> 
      <security mode="None" /> 
      <!-- Enable for SSL: mode="Transport" --> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="/services/DefaultService.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="DefaultEndpoint" 
       contract="OurNamespace.IOurContractAsync" 
       name="DefaultEndpoint" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

配置的端點可以在兩種模式下進行訪問。它僅取決於加載XAP文件的上下文:從http://example.com/slpage.htmlhttps://example.com/slpage.html。不幸的是,我們必須手動將「None」和「Transport」之間的設置設置爲安全模式。其他一切已經按照要求工作。當安全模式是「無」,我們通過https訪問,我們得到一個異常,「..提供了..https但預期http ...」,反之亦然。任何讓Silverlight自動決定使用哪種安全模式的機會?這個問題最簡單的解決方案是什麼?

在此先感謝

托馬斯

回答

5

我們終於結束了以下解決方案(不完全是瓦倫丁建議,但+1求救!):

ServiceReferences.ClientConfig同時包含綁定和端點配置是這樣的:

<configuration> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="DefaultBinding" 
       maxBufferSize="2147483647" 
       maxReceivedMessageSize="2147483647"> 
      <security mode="None" /> 
     </binding> 
     </basicHttpBinding> 
     <customBinding> 
     <binding name="SecureBinding"> 
      <textMessageEncoding messageVersion="Soap12WSAddressing10" /> 
      <httpsTransport maxBufferSize="2147483647" 
          maxReceivedMessageSize="2147483647" /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="/services/DefaultService.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="DefaultBinding" 
       contract="OurNamespace.IOurContractAsync" 
       name="DefaultEndpoint" /> 
     <endpoint address="/services/DefaultService.svc" 
       binding="customBinding" 
       bindingConfiguration="SecureBinding" 
       contract="OurNamespace.IOurContractAsync" 
       name="SecureEndpoint" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

在初始化,我們讀取App.Current.Host.Source.Scheme屬性。由ChannelFactory生成服務端,代碼類似這樣的片段:

protected string EndpointName { 
    get { 
    return (App.Current.Host.Source.Scheme == "https") ? 
     "SecureEndpoint" : "DefaultEndpoint"; 
    } 
} 

protected IOurContractAsync CreateInterface() { 
    var channelFactory = ChannelFactory<IOurContractAsync>(EndpointName); 
    return channelFactory.CreateChannel(); 
} 

希望這有助於!

此致敬禮 托馬斯

+0

耶看起來比傳遞https = true參數更好,如果你可以讀它從計劃沒有問題。 – 2011-02-18 14:48:18

1

我認爲可以有多種方式之一是提供initParams在以SL應用程序從網頁像

PARAM NAME =「initParams在」 值= 「HTTPS =真正的」

爲 HTTPS頁面和虛假的HTML頁面。在SL內部解析它 併爲端點設置安全模式 。

您可以在SL應用程序中以編程方式創建/編輯端點代理。

另一種方式可能是基於SL應用程序中沒有initparams的鏈接設置傳輸行爲(如果以https - > transport else開頭)我相信一旦sl應用程序被下載,鏈接應該不是相對的,這應該是一個可行的解決方案。

您可以創建一個工廠方法來創建服務代理,並將此設置代理邏輯放入其中,這將比完全刪除此serviceconfig文件更簡單。

只需將調用

MyServiceClient client = Factory.MakeClient() 

,我認爲它的優雅足夠的解決方案。在MakeClient中,您可以決定使用哪種傳輸安全性及其完成。

+0

感謝您的提示。是的,我已經意識到一些程序化的解決方案,大多數我可以完全拋棄`ServiceReferences.ClientConfig`,我不喜歡這樣做... – thmshd 2011-01-21 23:07:22