问题是:我需要连接到肥皂网服务;由java代码生成;通过C#到MS Visual Studio 2013使用ASP.Net客户端。
尝试1,通常的方式:
我使用wsdl添加了一个Web服务引用,并分配了以下凭据:
Credentials.Username.Username = "test";
Credentials.Password.Password = "test";
执行时,遇到以下异常:
The login information is missing!
尝试2:
我搜索过类似的问题:
how-to-go-from-wsdl-soap-request-envelope-in-c-sharp
Dynamic-Proxy-Creation-Using-C-Emit
c# - Client to send SOAP request and received response
我选择使用wsdl工具生成代理类,然后添加了 header属性,但我从Microsoft找到了以下注释:
注意:如果Web服务定义了表示SoapHeader或SoapUnknownHeader类型的SOAP头的成员变量,而不是从SoapHeader派生的类,则代理类将不具有关于该SOAP头的任何信息。
尝试3: 我试图在客户端web.config中更改服务模型:
<bindings>
<basicHttpBinding>
<binding name="CallingCardServicePortBinding">
<security mode="TransportWithMessageCredential" >
<message clientCredentialType="UserName"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
然后添加了第一次尝试的凭据,但出现以下错误:
MustUnderstand headers:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood
所以,现在我不知道该怎么做! 我无法控制Web服务,我需要构建一个理解它的客户端。
请帮助!
Soap Request模板如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="...">
<soapenv:Header>
<credentials>
<userName>someUserName</userName>
<password>somePassword</password>
</credentials>
</soapenv:Header>
<soapenv:Body>
<ser:someRequest>
.......
.......
.......
</ser:someRequest>
答案 0 :(得分:1)
如果目标Web服务使用身份验证,那么只有ASMX不会这样做,因为它不知道身份验证,加密等。您有2个选项:
这只是ASMX的扩展,使其能够识别安全/加密。 (以及一些其他功能)从技术上讲,您将添加对WSE DLL的引用,您的Soap代理将从WSE SOAP客户端而不是系统客户端扩展。
一旦这样做,代理类将具有可用于正确验证的其他用户名/密码属性。
设置属性并使用fiddler查看传出请求。如果标题不是您想要的(因为名称空间等),那么您可以编写自定义的外发消息检查器并很好地修改soap请求。
ASMX和WSE比WCF旧。 WCF试图将所有Web服务细微差别集中在一个屋檐下。如果你得到一个WCF服务引用,它(svcutil.exe)将自动为你创建代理类和正确的绑定。 (主要是定制)
一旦这样做,请尝试设置用户名和密码。
如果这不起作用(我经常努力为需要用户名/密码身份验证的基于远程java的服务生成正确的soap标头),您可以在web.config / app中定义静态标头块.config,将作为每个请求的一部分发送。
e.g。
<client>
<endpoint>
<headers>
<credentials>
<userName>someUserName</userName>
<password>somePassword</password>
</credentials>
</headers>
</endpoint>
</client>