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)