[英]Add Soap Header to Soap request in Visual Studio 2008
I'm trying to use a third party web service (so I do not have access to the web service code). 我正在尝试使用第三方Web服务(因此我无法访问Web服务代码)。 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?). 在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? 问题是,从Web服务的文档中我知道每个soap请求必须与以下信封和标题一起发送,您能告诉我如何在我的Soap请求中添加它吗? 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服务源或代理,我不能这样做,因为我无权访问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>
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. 我正在努力解决同样的问题,到目前为止已经编写了一个消息检查器 ,以便能够访问SOAP标头,虽然我不知道如何在那里获得wsse:security的东西而不必手动完成。 I would like to be able to use the WS-Security schema (as well as SAML schemas) to build the wsse:security stuff... 我希望能够使用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)
{
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.