2

我有一个使用 Web 服务的 VB.NET (2008) 控制台应用程序。我最初开始使用使用 WSDL.exe(或 Visual Studio 中的“添加 Web 服务”)导入 WSDL 的旧/旧(WCF 之前)技术编写它,该技术基于 System.Web.Services.Protocols.SoapHttpClientProtocol 创建类. 然而,我很快意识到这不是最好的方法(感谢 John Saunders 在我之前的问题中的评论——如何将对象的序列化 XML 传递给 Web 服务?)。

所以,我现在已经将我的代码转换为 WCF(使用“添加服务引用”,它基于 System.ServiceModel.ClientBase 创建类);它的工作原理或多或少相同,除了一个关键点:安全性。

我正在使用的 Web 服务是用 Java 编写的;虽然我们(我和开发 Web 服务的团队)都为同一家公司工作,但我并不能真正控制他们如何发布和公开 Web 服务。他们的要求是我通过 HTTP而不是HTTPS 传递用户名和密码(基本 HTTP 身份验证)。我知道这不是最安全的方法。但这是一场我现在无法战斗的战斗。

使用旧方法效果很好。但是,如果我尝试通过在 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

所以这很糟糕;并且在 .NET 3.5 中搜索 StackOverflow 和其他网站并没有太多解决这个问题的方法。我发现了我认为可能很有希望的东西(http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html);但是,看起来此解决方案需要在服务端和客户端进行配置更改。如前所述,我无法控制服务器端。

有没有办法使用基于 WCF 的客户端来完成此任务?还是我需要放弃并回到旧的方式?

编辑:我似乎在这方面取得了一些成功:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Basic" />
    <message clientCredentialType="UserName" />
</security>

但是微软帮助文章/教程中似乎没有提到这种安全模式(TransportCredentialOnly)。我在吠叫正确的树吗?

4

2 回答 2

2

就我而言,解决方案原来是将安全模式设置为“TransportCredentialOnly”,如下所示:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Basic" proxyCredentialType="None"
        realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

感谢 evgenyl 促使我向其他安全模式开放我的研究;但最终,成功的是“TransportCredentialOnly”而不是“Message”。

于 2013-04-23T06:10:48.613 回答
1

您收到此错误,因为“传输”安全模式假设 https。您可以使用消息安全模式。有关详细信息,请参阅此帖子:http: //msdn.microsoft.com/en-us/library/ms733137.aspx

于 2013-04-20T03:34:35.040 回答