我有一个VB.NET(2008)控制台应用程序,它使用Web服务。我最初使用旧的/遗留(pre-WCF)技术编写它,使用WSDL.exe(或Visual Studio中的“添加Web服务”)导入WSDL,该技术基于System.Web.Services.Protocols.SoapHttpClientProtocol创建类。 。但是,我很快就意识到这不是最好的方法(感谢John Saunders在上一个问题中的评论 - How to get serialized XML of object passed to web service?)。
所以,我现在已将我的代码转换为WCF(使用“Add Service Reference”,它创建基于System.ServiceModel.ClientBase的类);除了一个关键点:安全性之外,它的工作方式或多或少相同。
我正在使用的Web服务是用Java编写的;虽然我们(我和开发Web服务的团队)都在同一家公司工作,但我并没有太多控制他们如何发布和公开Web服务。他们的要求是我通过了用户名& HTTP上的密码(基本HTTP身份验证),不是 HTTPS。我知道这不是最安全的方式;但这是一场我现在无法抗争的战斗。
使用旧方法可以正常工作。但是如果我通过在app.config中设置它来尝试使用WCF执行此操作:
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
...并在代码中设置用户名和密码:
oServiceClient.ClientCredentials.UserName.UserName = "SomeUsername"
oServiceClient.ClientCredentials.UserName.Password = "SomePassword"
我礼貌地抛出了这个例外:
System.ArgumentException: The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via
这太糟糕了;并且搜索StackOverflow和其他站点并没有在.NET 3.5中解决这个问题。我发现了我认为可能有希望的东西(http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html);但是,看起来这个解决方案需要在服务端和客户端 上进行配置更改。如前所述,我对服务器方面没有任何控制权。
有没有办法使用基于WCF的客户端来实现这一目标?或者我是否需要放弃并回到原来的方式?
编辑:我似乎在这方面取得了一些成功:<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
<message clientCredentialType="UserName" />
</security>
但是这个安全模式(TransportCredentialOnly)似乎没有在Microsoft帮助文章/教程中引用。我咆哮着正确的树吗?
答案 0 :(得分:2)
在我的情况下,解决方案是将安全模式设置为“TransportCredentialOnly”,如下所示:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
相信evgenyl促使我开放我的研究其他安全模式;但最终,它是“TransportCredentialOnly”,而不是“消息”,它做了这个伎俩。
答案 1 :(得分:1)
您收到此错误,因为“传输”安全模式假设为https。您可以使用消息安全模式。有关详情,请参阅此帖子:http://msdn.microsoft.com/en-us/library/ms733137.aspx