Добавление заголовка Soap к запросу Soap в Visual Studio 2008
-
06-07-2019 - |
Вопрос
Я пытаюсь использовать сторонний веб-сервис (поэтому у меня нет доступа к коду веб-сервиса). В Visual Studio 2008 я создал новый проект веб-сайта (ASP и c #) и добавил веб-ссылку (не веб-службу! Так что я предполагаю, что это не служба WCF ... правильно?).
Проблема в том, что из документации веб-службы я знаю, что каждый запрос на мыло должен отправляться со следующим конвертом и заголовком. Скажите, пожалуйста, как добавить это в мои запросы на мыло? Все решения, которые я нашел, требовали изменения источника веб-службы или прокси-сервера, я не могу этого сделать, потому что у меня нет доступа к источнику веб-службы, а прокси-сервер веб-службы в клиенте в Visual Studio 2008 доступен только для чтения. временный файл!
<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>
Решение
Вы можете статически добавлять заголовки к сообщениям в файле конфигурации, используя заголовки элемент в конечной точке элемента. Каждый дочерний элемент элемента заголовков будет скопирован как есть в заголовке вашего сообщения.
Другие советы
Я борюсь с этой же проблемой и до сих пор написал сообщение Инспектор , чтобы иметь возможность получить доступ к заголовкам SOAP, хотя я не уверен, как получить туда wsse: security без необходимости делать это вручную. Я хотел бы иметь возможность использовать схему WS-Security (а также схемы SAML) для создания wsse: security stuff ...
Для чего стоит мой код инспектора сообщений ниже, если я решу это, я опубликую его в этой теме.
Вот где я добавляю поведение клиенту:
client.Endpoint.Behaviors.Add(new CustomBehavior());
msgOutput = client.ProvideAndRegisterDocumentSetXDR(msgInput);
А вот инспектор сообщений и пользовательское поведение:
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)
{
}
}