我有一个来自我们客户公司的.WSDL文件,我需要用它来调用一个网络服务。他们的系统是SAP(SAP PI)。 我的应用程序是在VS 2008中开发的C# .NET 3.5客户端。我在Visual Studio中使用他们提供的.WSDL文件添加了一个服务引用。 这为我创建了一个参考类,让我用来调用他们的服务,并在app.config文件中为我设置了几个绑定。
我没有修改app.config文件中的任何内容,但确实创建了调用他们的web服务的代码。 然而,当我调用他们的web服务时,我收到了以下异常。
HTTP请求未经授权,客户端认证方案为 "匿名"。 从服务器接收到的认证头是'Basic realm="SAP NetWeaver Application Server ..."'。
(我稍微修改了'Basic realm'部分使用的字符串,以便不泄露。)
是不是 app.config 没有从 WSDL 中得到正确的构建?我是不是应该以某种方式修改app.config文件?
我已经尝试过的事情。
如果有任何指点或帮助,将不胜感激。
编辑:经过一番调查,我发现Visual Studio对扩展元素Policy和Policy断言有几个警告。
我无法找出这是否与我当前的认证方案问题有关。 看起来确实是相关的,但我也没能找到任何解决方案来解决这些策略警告。 似乎WCF不能很好地处理wsdl中的语句。
大多数SAP服务不支持匿名,所以通过一些形式的认证数据与调用,用户和密码X.509票...
如果你正在发送认证数据与调用的尝试这个
要求SAP的人重新生成WSDL,其中不包含SAP断言,不包含策略,SOAP 1.1。
作为起点,我会验证你是否能用提供的用户名和密码成功调用服务。使用类似于 SoapUI 来测试一切工作是否正确--只需创建一个新的项目,导入SAP PI提供的WSDL,设置用户名和密码并执行调用。你可能会得到某种形式的异常和一个空的有效载荷,但至少可以验证用户名和密码是否正确。
一旦你验证了这一点,检查你的应用程序是否正确地调用了服务,并且http基本认证头正在被发送。你可以通过使用网络监控工具来确认http请求是否被正确生成。像netcat for Windows这样的工具就可以做到--只要让它监听本地机器上的一个端口,然后指定localhost和端口作为你的SOAP端点。
一旦你确认这两点都是正确的,你的调用就会成功。
一定是Basic认证头丢失了,或者是凭证出了问题。
如果一个服务是通过它的SOAP适配器发布的,SAP PI总是默认为Basic Authentication。我会调查WCF是否真的发送了那个头(例如,将你的客户端点指向TCP Gateway,让TCP Gateway从WSDL指向SAP PI端点)。
关于警告。AFAIK由SAP PI生成的WSDL总是包含这些Policy Tags,你无法真正忽略它。你可以做的是简单地把它们扔掉,因为它们并不真正有效。