На сервисе:
class MyService : IMyService
{
public Authentication Authenticator { get; set; } = new Authentication();
[OperationContract]
[WebMethod]
[SoapHeader("Authenticator")]
public string SimpleMethod(string attr1, string documentNumber, string attr2)
{
if (Authenticator.Login != "super_user" || Authenticator.Password != "super_password") return "Auth Error!";
return attr1+attr2;
}
}
//пробовал здесь использовать атрибуты DataContract и DataMember, не помогло
public class Authentication : SoapHeader
{
public string Password { get; set; }
public string Login { get; set; }
}
С клиента отправляю запрос так: Реализация выбрана в связи с тем, что мой сервис тестовый, в реальности нужно работать с сервисом о котором известна только его сигнатура методов, а url, логин и пароль будут подставляться динамически. В данном примере извне подставляются url, namespace и имя сервиса, логин и пароль.
public string Invoke()
{
string soapStr =
@"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Header>
<Authentication xmlns=""{0}"" soap:mustUnderstand=""0"">
<Login xmlns=""http://tempuri.org/"">{1}</Login>
<Password xmlns=""http://tempuri.org/"">{2}</Password>
</Authentication>
</soap:Header>
<soap:Body>
<SimpleMethod xmlns=""{0}"">
<attr1>hello!</attr1>
<attr2>world!</attr2>
</SimpleMethod>
</soap:Body>
</soap:Envelope>";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url);
req.Headers.Add("SOAPAction", $"\"{nameSpace}{serviceName}/" + "SimpleMethod" + "\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
using (Stream stm = req.GetRequestStream())
{
soapStr = string.Format(soapStr,nameSpace,login,password);
using (StreamWriter stmw = new StreamWriter(stm))
{
stmw.Write(soapStr);
}
}
try
{
using (StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream()))
{
return responseReader.ReadToEnd();
}
}
catch(Exception e)
{
return e.Message;
}
}
Без аутентификации методы работают прекрасно, но если добавить header с аутентификацией - хэдер как будто не разбирается. (Login
и Password
всегда null
). Подозреваю, что ошибка в формате отправляемого запроса, но определить ее никак не получается.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени сутокПытаюсь наладить передачу сообщения от клиента другому клиенту через сервер(использую TcpListener/TcpClient)
Имеется программа на C# с базой данных (MS SQL), использую Visual Studio 2015Что делать? app