我有一个来自客户公司的. wsdl文件,我需要使用它来调用web服务。他们的系统是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…"'.
(我稍微修改了'基本领域'部分中使用的字符串,以便不给出它。)
app.config没有从WSDL正确构建吗?我应该以某种方式修改app.config文件吗?
我尝试过的事情:
- 将
app.config
中的authenticationScheme
从Anonymous更改为Basic
(以及所有其他身份验证类型) - 更改
app.config
中的领域字符串以匹配异常消息 中的领域 - 在我的代码中设置
ClientCredentials.Username
对象中的username/pw字段
任何指示或帮助将不胜感激。
EDIT:经过更多的调查,我发现Visual Studio有几个关于扩展元素Policy和Policy断言的警告:
自定义工具警告:可选的WSDL扩展元素'Policy'从命名空间'http://schemas.xmlsoap.org/ws/2004/09/policy'不是处理。
自定义工具警告:以下策略断言未导入:
XPath://wsdl:定义[@targetNamespace = " urn: sap-com:文档:sap: rfc函数']/wsdl: binding [@ name = ' Binding_FieldValidation ']断言:…
我无法找出这是否与我当前的身份验证方案问题有关。这似乎是相关的,但我还没有找到任何解决方案来解决这些政策警告。看来WCF不能很好地处理WSDL中的<wsp:Policy>
语句。
大多数SAP服务不支持匿名。因此,在调用中传递某种形式的身份验证数据。用户和密码/X.509票证…
如果你正在发送验证数据调用try this
请SAP人员重新生成WSDL没有SAP断言,没有策略,SOAP 1.1。您也可以尝试手工编辑WSDL,以删除额外的废话…
作为起点,我将验证您可以使用提供的用户名和密码成功调用服务。使用SoapUI之类的东西来测试一切是否正常工作—只需创建一个新项目,导入SAP PI提供的WSDL,设置用户名和密码并执行调用。您可能会得到空负载的某种形式的异常,但至少这会验证用户名和密码是否正确。
一旦你验证了它的工作,检查你的应用程序正在正确地调用服务,并且http基本身份验证头正在发送。您可以通过使用网络监控工具并检查http请求是否正确生成来确认这一点。Windows上的netcat之类的东西可以做到这一点——只需让它监听本地机器上的一个端口,然后指定localhost和端口作为SOAP端点。
一旦你验证了这两个都是正确的,你的调用应该成功。
一定是缺少基本身份验证头或有什么错误带着证件。
如果服务是通过SOAP适配器发布的,那么SAP PI总是默认为基本身份验证。我会调查一下WCF是否真的发送了这个报头(例如,将您的客户端端点指向TCP网关,并让TCP网关从WSDL指向SAP PI端点)。关于警告:SAP PI生成的WSDL将始终包含这些策略标记,您不能真正提交它。你能做的就是把它们扔掉因为它们没有经过验证