Добрый день.
Я здесь с вопросом, который никак самостоятельно не могу осознать.
Вопрос: что такое UriTemplate и с чем его едят?
Я разбирал на конкретных примерах. Например:
[ServiceContract(Namespace = "urn:example:services")]
public interface ISomeWcf
{
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "GetResult?client={client}&password={password}&messageId={messageId}")]
string GetResultHttpGet(string client, string password, string messageId);
}
В данном конкретном случае UriTemplate задает шаблон, по которому мы через REST-запрос можем обратиться к методу GetResultHttpGet. Читал МСДН, но не разобрался.
Зачем указывать Namespace = "urn:example:services" ?
Можете подсказать, что с UriTemplate делать? Такое впечатление что рядом брожу с ответом, а сформулировать его не могу.
Спасибо
Ответ
UriTemplate задаёт шаблон, по которому определяется, должен ли входящий запрос с данным Uri быть направлен на обслуживание методом GetResultHttpGet, а также сопоставляет части Uri параметрам метода.
Допустим для данного контракта базовый адрес
http://hostname/SomeWcf/
Если приложением (или прямо браузером) сделать GET запрос
http://hostname/SomeWcf/GetResult?client=CLI&password=PWD&messageId=MSG
то будет вызван метод GetResultHttpGet сервиса. При этом части Uri станут значениями соответствующих параметров:
string GetResultHttpGet(string client, string password, string messageId)
{
//здесь части Uri станут значениями параметров:
//client = "CLI";
//password = "PWD";
//messageId = "MSG";
...
}
Если отклониться от шаблона, задав что-то другое, например
http://hostname/SomeWcf/GetResult2?name=NAME
или
http://hostname/SomeWcf/GetResult3/Name/Foo
то метод GetResultHttpGet вызван не будет.
Что касается свойства Namespace у атрибута ServiceContract
[ServiceContract(Namespace = "my.company.com")]
то оно фигурирует в заголовке soap-envelope
Если его не указывать
[ServiceContract]
то вместо my.company.com там будет значение по умолчанию (http://tempuri.org).
Если интерфейс, описывающий контракт находится в сборке, на которую ссылаются и клиент и сервер, то в принципе Namespace может быть любым. Если же интерфейс описан дважды - в клиентской части и в серверной, или если вы создаёте клиента для уже существующего сервиса с определённым Namespace, то Namespace должны совпадать, чтобы клиент и сервер понимали друг-друга, иначе будет ответ
Комментариев нет:
Отправить комментарий