Web services 如何添加<;soap:标题>;标签?WSDL没有与这些信息一起出现

Web services 如何添加<;soap:标题>;标签?WSDL没有与这些信息一起出现,web-services,c#-4.0,ws-security,soapheader,web-reference,Web Services,C# 4.0,Ws Security,Soapheader,Web Reference,我需要在我的邮件中添加如下内容: <soap:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soap:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org

我需要在我的邮件中添加如下内容:

  <soap:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soap:mustUnderstand="1">
      <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="unt_Z1k4LnxEmBzzKuPP">
        <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">iNs+LF1iwwPU2AMer8uU6NKY9tfzgYqMTaP3mIEgoK0=</wsse:Nonce>
        <wsu:Created>2012-04-22T11:57:30Z</wsu:Created>
      </wsse:UsernameToken>
      <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsu:Created>2012-04-22T11:57:30Z</wsu:Created>
        <wsu:Expires>2012-04-22T11:58:30Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </soap:Header>

用户
密码
iNs+LF1iwwPU2AMer8uU6NKY9tfzgYqMTaP3mIEgoK0=
2012-04-22T11:57:30Z
2012-04-22T11:57:30Z
2012-04-22T11:58:30Z
我正在调用一个web服务,它返回一个500错误响应,这基本上意味着它无法进行身份验证,我猜是因为我从消息中丢失了这些信息,即使消息上有一个身份验证头。这会发生吗

如何在消息中添加WS-Security头并在代码中添加所有这些信息? 我在VisualStudio中使用AddWebReference添加了该服务


谢谢。

最优雅的解决方案是一个过时的解决方案,它涉及使我用来从.NET 3.5调用.NET 2.0的类库,安装WSE 3.0,侵入一些VS配置文件以使加载项工作,并将类库项目作为启用WSE的项目启用

更新Web引用生成两个代理类(例如Myservice和MyServiceWse),。一个继承自SoapHttpClient,这是WCF代理生成的默认值,最新继承自WebServicesClientProtocol

最新的是您需要使用WS-Security头调用旧的ASMX Web服务

剩下的很简单:

MyServiceWse client = new MyServiceWse();

        UsernameToken token = new UsernameToken(userName, password, PasswordOption.SendPlainText); // or what service specs rquired, other than plaintext.

        client.RequestSoapContext.Security.Tokens.Add(token);
        client.RequestSoapContext.Security.Timestamp.TtlInSeconds = 60;

        client.YourMethod(); 
对于一个过时的API来说是如此简单,微软在VS2005之后没有包括它,你需要在序列化之前、序列化之后、使用扩展和其他东西处理捕获消息的流和字符串操作

如果您有一个解决方案,使用Add Reference而不是旧的Add Web Reference和WSE使用WS-Security头、UsernameToken、创建的时间戳、过期等进行简单调用

请让我知道

附言:找到这个问题的解决方案,并通过一些有用的链接进行回答


+1谢谢Taskos。补充链接-微软的官方行:编辑生成的源代码=(这里有WSE v3.0可用)