通过WSDL获得结果 - C#

时间:2017-06-06 12:42:13

标签: c# web-services soap wsdl

我正在尝试将此Header类添加到我的SOAP请求中,但无法查看如何。 Header类是作为实现的一部分给我的,但没有关于如何使用它的说明,我有点卡住 - 我以前没有使用过WSDL和Web服务。我肯定答案一定很容易,但我看不到它。

标题要求

<soapenv:Header>
  <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken wsu:Id="UsernameToken-19" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
      <wsse:Username>##USERNAME##</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:UsernameToken>
  </wsse:Security>
</soapenv:Header>   

标题类

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Channels;
using System.Web;
using System.Xml;
using System.Xml.Serialization;

namespace Consuming
{
    public class SecurityHeader : MessageHeader
    {
        private readonly UsernameToken _usernameToken;

        public SecurityHeader(string id, string username, string password)
        {
            _usernameToken = new UsernameToken(id, username, password);
        }

        public override string Name
        {
            get { return "Security"; }
        }

        public override string Namespace
        {
            get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
        }

        protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UsernameToken));
            serializer.Serialize(writer, _usernameToken);
        }
    }


    [XmlRoot(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
    public class UsernameToken
    {
        public UsernameToken()
        {
        }

        public UsernameToken(string id, string username, string password)
        {
            Id = id;
            Username = username;
            Password = new Password() { Value = password };
        }

        [XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
        public string Id { get; set; }

        [XmlElement]
        public string Username { get; set; }

        [XmlElement]
        public Password Password { get; set; }
    }

    public class Password
    {
        public Password()
        {
            Type = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";
        }

        [XmlAttribute]
        public string Type { get; set; }

        [XmlText]
        public string Value { get; set; }
    }
}

代码

var mySoapHeader = new SecurityHeader("ID","Username","password");
var client = new GroupWebServiceClient(); // Created from Add Web Reference

client.?????? = mySoapHeader;// I can't see how to add the Header to the request

var response = new groupNameListV1(); 
response = client.getAllDescendants("6335");//This needs the header - omitting gives "An error was discovered processing the <wsse:Security> header"

修改

我最终弄清楚了,结果很简单 - 添加解决方案以防其他人发现它有用

using (new OperationContextScope(client.InnerChannel))
    {
         OperationContext.Current.OutgoingMessageHeaders.Add(
                    new SecurityHeader("ID", "USER", "PWD"));

         var response = new groupNameListV1();
         response = client.getAllDescendants("cng_so_6553");
         //other code
    }

1 个答案:

答案 0 :(得分:0)

通常,您需要添加行为扩展名。

创建一个实现IClientMessageInspector的类。在BeforeSendRequest方法中,将自定义标头添加到外发邮件中。它可能看起来像这样:

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,  System.ServiceModel.IClientChannel channel)
{
HttpRequestMessageProperty httpRequestMessage;
object httpRequestMessageObject;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
{
    httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
    if (string.IsNullOrEmpty(httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER]))
    {
        httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER] = this.m_userAgent;
    }
}
else
{
    httpRequestMessage = new HttpRequestMessageProperty();
    httpRequestMessage.Headers.Add(USER_AGENT_HTTP_HEADER, this.m_userAgent);
    request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
}
return null;
}

然后创建将消息检查器应用于客户端运行时的端点行为。您可以通过属性或使用行为扩展元素的配置来应用行为。

Here是如何向所有请求消息添加HTTP用户代理标头的示例。我在一些客户中使用过它。

这是你的想法吗?