在C#中为Web服务调用添加自定义SOAPHeader

时间:2013-09-24 11:43:17

标签: c# soapheader

我正在尝试在调用Web服务之前在c#中添加自定义soap标头信息。我正在使用SOAP Header类来完成这项工作。我可以部分地这样做但不完全按我需要的方式完成。这是我需要肥皂标题看起来像

的方式
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <UsernameToken>
         <Username>USERID</Username>
         <Password>PASSWORD</Password>
        </UsernameToken>    
      </Security>
   </soap:Header>
   <soap:Body>
   ...

我可以添加soap header,如下所示

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header>
      <UsernameToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <Username>UserID</Username>
         <Password>Test</Password>
      </UsernameToken>
   </soap:Header>
   <soap:Body>

我无法做的是添加包含“UsernameToken”的“Security”元素,如第一个示例中所示。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

此链接adding soap header对我有用。我正在调用一个我没有编写的SOAP 1.1服务,并且无法控制。我使用的是VS 2012,并在我的项目中将该服务添加为Web引用。希望这有帮助

我按照J. Dudgeon的帖子中的步骤1-5进入了线程的底部。

以下是一些示例代码(这将在一个单独的.cs文件中):

namespace SAME_NAMESPACE_AS_PROXY_CLASS
{
    // This is needed since the web service must have the username and pwd passed in a custom SOAP header, apparently
    public partial class MyService : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
        public Creds credHeader;  // will hold the creds that are passed in the SOAP Header
    }

    [XmlRoot(Namespace = "http://cnn.com/xy")]  // your service's namespace goes in quotes
    public class Creds : SoapHeader
    {
        public string Username;
        public string Password;
    }
}

然后在生成的代理类中,在调用服务的方法上,根据J Dudgeon的第4步添加此属性:[SoapHeader("credHeader", Direction = SoapHeaderDirection.In)]

最后,这是对生成的代理方法的调用,标题为:

using (MyService client = new MyService())
{
    client.credHeader = new Creds();
    client.credHeader.Username = "username";
    client.credHeader.Password = "pwd";
    rResponse = client.MyProxyMethodHere();
}