#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;
}
}