2

任何人都可以指出我如何使用Silverlight的SSL客戶端證書訪問安靜的Web服務的正確方向?Silverlight和SSL客戶端證書

我似乎無法找到任何關於如何處理它們,甚至是否支持它們。

乾杯。

回答

1

Slipjig提到了這一點:

「瀏覽器堆棧呢,和幾乎自動地,如果你'願意忍受其他限制(缺乏對所有HTTP動詞的支持,強制響應狀態代碼等)「。

如果這是可以接受的你,看看微軟自己如何處理這部分使用自定義X-HTTP-法頭,就像他們是如何做到這一點的WCF和OData的相應的API:

http://www.odata.org/developers/protocols/operations

在MSDN,微軟也提到了這個關於與SharePoint 2010的WCF基於REST API一起使用REST:

msdn.microsoft.com/en-us/library/ff798339.aspx

「在實踐中,許多火災所有和其他網絡中介阻止GET和POST以外的HTTP動詞。要解決此問題,WCF數據服務(和OData標準)支持稱爲「動態隧道」的技術。在這種技術中,將PUT,DELETE和MERGE請求作爲POST請求提交,並且X-HTTP-Method標頭指定接收方應該應用於請求的實際動詞。有關詳細信息,請參閱OData Web站點上的MSDN上的X-HTTP-Method和OData:Operations(通過POST的方法隧道)部分。「

Don Box也對此有一些說法,但對於GData具體說明如下:

www.pluralsight-training.net/community/blogs/dbox/archive/2007/01/16/45725.aspx

「如果我是建設的GData客戶,我真的不知道爲什麼我會打擾使用因爲X-HTTP-Method-Override將在更多情況下/部署中工作,所有DELETE和PUT方法。「

有有關Silverlight和Java的互操作的文章也被賦予了相同的建議解決的Silverlight這一限制:

www.infoq.com/articles/silverlight-java-interop

」 Silverlight支持只有GET和POST HTTP方法。一些防火牆限制使用PUT和DELETE HTTP方法。

只有使用GET和POST HTTP方法才能創建真正的RESTful服務(符合上面列出的所有REST原則),換句話說,REST體系結構不需要特定的HTTP映射。 Google的GData X-Http-Method-Override標題就是這種方法的一個例子。

下面的HTTP方法覆蓋可以在報頭中設置來完成PUT和DELETE操作如果Web服務解釋對某個帖子的X-HTTP-方法-Override標頭:

* X-HTTP-Method-Override: PUT 
* X-HTTP-Method-Override: DELETE" 

希望這有助於 -Josh

1

這取決於您是否使用瀏覽器HTTP堆棧或客戶端HTTP堆棧。客戶端堆棧不支持客戶端證書,句點。如果您願意忍受其他限制(缺少對所有HTTP動詞的支持,強制響應狀態代碼等),瀏覽器堆棧會自動執行。

但是,我已經遇到了一個問題,在OOB場景中使用具有客戶端證書的瀏覽器堆棧。在這些情況下Prism模塊加載失敗 - 請求到達IIS,但沒有明顯原因導致500服務器錯誤。如果我設置IIS忽略客戶端證書,或者如果我運行在瀏覽器應用程序,它工作正常: -/

0
Dim url As Uri = New Uri(Application.Current.Host.Source, "../WebService.asmx") 
Dim binding As New System.ServiceModel.BasicHttpBinding 
If url.Scheme = "https" Then 
    binding.Security.Mode = ServiceModel.BasicHttpSecurityMode.Transport 
End If 

binding.MaxBufferSize = 2147483647 'this value set to override a bug, 
binding.MaxReceivedMessageSize = 2147483647 'this value set to override a bug, 
Dim proxy As New ServiceReference1.WebServiceSoapClient(binding, New ServiceModel.EndpointAddress(url)) 
proxy.InnerChannel.OperationTimeout = New TimeSpan(0, 10, 0)