在Visual Studio 2008中将Soap Header添加到Soap请求中

时间:2022-12-03 22:55:57

I'm trying to use a third party web service (so I do not have access to the web service code). In Visual Studio 2008 I created a new web site project (ASP and c#), and added the web reference (not web service! so I guess it is not a WCF service... correct?).

我正在尝试使用第三方Web服务(因此我无法访问Web服务代码)。在Visual Studio 2008中,我创建了一个新的网站项目(ASP和c#),并添加了Web引用(不是Web服务!所以我猜它不是WCF服务......正确吗?)。

The problem is that from the documentation of the web service I know that each soap request has to be sent with the following envelope and header, can you please tell me how to add this in my Soap requests? All the solutions I found required modifying the web service source or proxy, I can't do that because I don't have access to the web service source and the web service proxy in the client in Visual studio 2008 comes in a read-only temp file!

问题是,从Web服务的文档中我知道每个soap请求必须与以下信封和标题一起发送,您能告诉我如何在我的Soap请求中添加它吗?我发现的所有解决方案都需要修改Web服务源或代理,我不能这样做,因为我无权访问Web服务源,Visual Studio 2008中客户端的Web服务代理是只读的临时文件!

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" soap:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>gimme.data@stats.com</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Ima5tatto</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:ns2="http://neighbourhood.statistics.gov.uk/nde/v1-0/discoverystructs">
<ns2:AreaAtLevelElement>
<AreaIdWithLevelType>
<AreaId>276704</AreaId>
<LevelTypeId>12</LevelTypeId>
</AreaIdWithLevelType>
</ns2:AreaAtLevelElement>
</soap:Body>
</soap:Envelope>

2 个解决方案

#1


You can statically add headers to the messages in the configuration file using the headers element in the endpoint element. Each child element of the headers element will be copied as is in the header of your message.

您可以使用endpoint元素中的headers元素将标头静态添加到配置文件中的消息。 header元素的每个子元素都将按照邮件标题中的原样进行复制。

#2


I'm struggling with this same issue and thus far have written a message inspector to be able to get to the SOAP headers, although I'm not sure how to get the wsse:security stuff in there without having to do it manually. I would like to be able to use the WS-Security schema (as well as SAML schemas) to build the wsse:security stuff...

我正在努力解决同样的问题,到目前为止已经编写了一个消息检查器,以便能够访问SOAP头,虽然我不知道如何在那里获得wsse:security的东西而不必手动执行。我希望能够使用WS-Security模式(以及SAML模式)来构建wsse:security的东西......

For what it's worth my message inspector code is below, if i solve this I'll post it on this thread.

我的消息检查员代码如下所示,如果我解决了这个问题,我会将它发布在这个帖子上。

Here's where I add the behavior to the client:

这是我将行为添加到客户端的位置:

client.Endpoint.Behaviors.Add(new CustomBehavior());
msgOutput = client.ProvideAndRegisterDocumentSetXDR(msgInput);

And here is the message inspector and custom behavior:

这是消息检查器和自定义行为:

public class CustomMessageInspector : System.ServiceModel.Dispatcher.IClientMessageInspector
{
    public void AfterReceiveReply(ref WCF.Message reply, object correclationState)
    {
    }

    public Object BeforeSendRequest(ref WCF.Message request, IClientChannel channel)
    {
        MessageHeaders headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
        MessageHeader header = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "");
        request.Headers.Add(header);
        return null;
    }
}


public class CustomBehavior : System.ServiceModel.Description.IEndpointBehavior
    {
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRunTime)
        {
            CustomMessageInspector inspector = new CustomMessageInspector();
            clientRunTime.MessageInspectors.Add(inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }
    }

#1


You can statically add headers to the messages in the configuration file using the headers element in the endpoint element. Each child element of the headers element will be copied as is in the header of your message.

您可以使用endpoint元素中的headers元素将标头静态添加到配置文件中的消息。 header元素的每个子元素都将按照邮件标题中的原样进行复制。

#2


I'm struggling with this same issue and thus far have written a message inspector to be able to get to the SOAP headers, although I'm not sure how to get the wsse:security stuff in there without having to do it manually. I would like to be able to use the WS-Security schema (as well as SAML schemas) to build the wsse:security stuff...

我正在努力解决同样的问题,到目前为止已经编写了一个消息检查器,以便能够访问SOAP头,虽然我不知道如何在那里获得wsse:security的东西而不必手动执行。我希望能够使用WS-Security模式(以及SAML模式)来构建wsse:security的东西......

For what it's worth my message inspector code is below, if i solve this I'll post it on this thread.

我的消息检查员代码如下所示,如果我解决了这个问题,我会将它发布在这个帖子上。

Here's where I add the behavior to the client:

这是我将行为添加到客户端的位置:

client.Endpoint.Behaviors.Add(new CustomBehavior());
msgOutput = client.ProvideAndRegisterDocumentSetXDR(msgInput);

And here is the message inspector and custom behavior:

这是消息检查器和自定义行为:

public class CustomMessageInspector : System.ServiceModel.Dispatcher.IClientMessageInspector
{
    public void AfterReceiveReply(ref WCF.Message reply, object correclationState)
    {
    }

    public Object BeforeSendRequest(ref WCF.Message request, IClientChannel channel)
    {
        MessageHeaders headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
        MessageHeader header = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "");
        request.Headers.Add(header);
        return null;
    }
}


public class CustomBehavior : System.ServiceModel.Description.IEndpointBehavior
    {
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRunTime)
        {
            CustomMessageInspector inspector = new CustomMessageInspector();
            clientRunTime.MessageInspectors.Add(inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }
    }