我正在尝试使用由wsdl.exe工具创建的代理类使用Web服务SOAP。我的代理类继承自WebServicesClientProtocol。
public partial class ProxyClass : Microsoft.Web.Services3.WebServicesClientProtocol
我们一直在与许多提供商合作,并且当他们的服务是SOAP时,我们总是使用这种方式来使用他们的Web服务。但是现在我有了一个用户名和密码来调用它们提供的方法。
在SoapUI中,我可以配置身份验证,并且我的SOAP请求(POST)包含如下所示的Security标签:
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-F553155D3B9F83F7E515385814519794">
<wsse:Username>user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">yCDGvunHkyT0Hk2pCXXiSA==</wsse:Nonce>
<wsu:Created>2018-10-03T15:44:11.979Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
响应符合我的预期。但是问题是当我尝试在客户端应用程序中执行相同操作时。 当我需要调用方法时,我将实例化我的代理类的对象并使用以下行:
ProxyClass service = new ProxyClass (this.urlWebService);
UsernameToken token = new UsernameToken(USERNAME, PASSWORD, PasswordOption.SendPlainText);
service.RequestSoapContext.Security.Tokens.Add(token);
...
service.Method(...);
其中USERNAME和PASSWORD是常量,包含与我用于SoapUI的请求相同的信息。
当我调试应用程序时,service.Method中的Invoke调用将引发异常。
提供了无效的安全令牌(在处理用户名令牌时发生错误),位于System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage消息,WebResponse响应,Stream responseStream,布尔asyncCall) zh-cn System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串methodName,Object []参数)
我不知道我固定的令牌中是否缺少配置属性,或者我尝试的内容无法实现,这将导致开发其他解决方案的时间更长。
我希望你们中的一些人在这种问题上有经验并摆脱了这种情况,所以您可以帮助我。
先谢谢了。