Прочитайте заголовок SOAP перед отправкой на C#

#c# #web-services #soap

#c# #веб-службы #soap

Вопрос:

Я использовал wsdl.exe сгенерировать класс на C # для вызова веб-службы. Это работает нормально, пока для этой веб-службы не требуется заголовок. Теперь мне нужно добавить заголовок, подобный этому:

 <soapenv:Header>
  <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
     <wsse:UsernameToken>
        <wsse:Username>myUsername</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">myPassword</wsse:Password>
     </wsse:UsernameToken>
  </wsse:Security>
  

Поэтому я добавил класс Security с классом UsernameToken внутри, который содержит имя пользователя и пароль, и добавил его в вызывающий класс. Проблема с захватом всего отправляемого сообщения SOAP может быть решена с помощью расширения SOAP. Я мог бы добиться:

 <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <UsernameToken>
       <Username>username</Username>
       <Password>verysecret</Password>
    </UsernameToken>
</Security>
  

Итак, теперь мне не хватает этой wsse части и атрибута «Type» в теге пароля?
Как это можно сделать? Должен ли я использовать a [MessageContract] вместо этого?
Или я могу просто «жестко запрограммировать» строку и поместить ее в заголовок?

Комментарии:

1. веб-служба, которой требуется заголовок, является ли это WCF или обычной веб-службой?

2. Действительно ли этот вопрос касается заголовка или отправки имени пользователя и пароля с каждым запросом на аутентификацию?

3. Я бы сказал, обычный веб-сервис (EAR, работающий на WebSphere). Конечно, проблема заключается в том, что в конце отправляется имя пользователя и пароль, но я делаю это шаг за шагом. Прямо сейчас я хочу посмотреть, что я отправляю.

4. @Graffl ЕСЛИ вы хотите видеть SOAP-сообщение только в учебных целях, просто просмотрите необработанное SOAP-сообщение, которое вы получаете на стороне сервера.

5. Если у него есть доступ к серверу…

Ответ №1:

У вас есть несколько вопросов в вашем вопросе, но ответить «Тем не менее, моя самая большая проблема сейчас в том, что я не вижу, что на самом деле было отправлено в качестве заголовка». вы можете увидеть конверт SOAP в методе private void CallWebSvcCallAsync(model.WebSvcMethod webSvcMethod)

Установите точку останова var call = new websvcasync.Operations.CallAsyncOp(webSvcMethod, _cancelToken, State.Instance.ConfigProxy, State.Instance.ConfigTimeout.Timeout); и проверьте webSvcMethod.SampleReqMsg . Это даст вам представление о том, какой конверт отправляется.

Если вы можете отсортировать структуру конверта SOAP, вы должны быть готовы к работе.

Комментарии:

1. Однако я бы рекомендовал попытаться получить SOAP-конверт, который, как вы знаете, работает, а затем использовать WsdlUI и сравнивать и изменять, чтобы получить желаемые результаты.