Как заголовки SOAP работают в веб-службах ASMX?

#asp.net #web-services #soap #asmx

#asp.net #веб-сервисы #soap #asmx

Вопрос:

У меня есть проект, который использует файл asmx с [webMethods] и [SOAPHeader («Auth»)]. У меня нет опыта использования SOAP, и я пока не понимаю, как это работает.

Просматривая код, я заметил, что вы можете использовать переменную с тем же именем, что и заголовок, и она содержит данные. Как данные отправляются в заголовок? Откуда это берется?

Ответ №1:

Данные отправляются в заголовке с использованием класса, производного от SOAPHeader. Этот класс будет объявлен как свойство в вашем классе webservice. Затем в вашем веб-методе вы будете проверять информацию аутентификации в этом свойстве перед обработкой фактического метода.

Простую реализацию можно найти здесь http://www.codeproject.com/KB/cpp/authforwebservices.aspx

Следующая ссылка msdn рассказывает о другом подобном методе, который был бы более сложнымhttp://msdn.microsoft.com/en-us/library/9z52by6a.aspx.

Основная идея передачи данных в заголовке остается прежней.

Ответ №2:

Данные поступают из XML в <soap:Header> раздел SOAP envelope.

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

1. Итак, что-то отправляет запрос SOAP, и этот атрибут захватывает заголовок? Это правильно?

2. Более или менее. Может быть более одного заголовка. Будет захвачен только соответствующий заголовок.

Ответ №3:

Создайте класс для своего заголовка soap, как обычно.

 public class AuthHeader : SoapHeader
{
    public string CompanyID;
    public string Username;
    public string Password;
}
  

Тогда в вашем обычном классе была ссылка.

 public class MyClass : WebService
{
    public readonly AuthHeader authHeader;

    [SoapHeader("authHeader", Direction = SoapHeaderDirection.In)]
    [WebMethod(CacheDuration = 20
        , EnableSession = true
        , Description = "Find stuff now."
        , MessageName = "FindStuff")]
    [ScriptMethod(UseHttpGet = false
        , ResponseFormat = ResponseFormat.Xml
        , XmlSerializeString = true)]

    public MyResponseClass FindStuff(string searchString)
    {
        MyResponseClass myResponseClass = new MyResponseClass();
        if (authHeader.Username == "myUser" amp;amp;
            authHeader.Password == "myPass" amp;amp;
            authHeader.CompanyID == "BobsTire")
        {
            ....
            myResponseClass = ....
        }
        return myResponseClass;
    }
}