Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

WCF - назначение UriTemplate?

Добрый день.
Я здесь с вопросом, который никак самостоятельно не могу осознать.
Вопрос: что такое 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
... my.company.com/ISomeWcf/GetResultHttpGet ... ...
Если его не указывать
[ServiceContract]
то вместо my.company.com там будет значение по умолчанию (http://tempuri.org).
Если интерфейс, описывающий контракт находится в сборке, на которую ссылаются и клиент и сервер, то в принципе Namespace может быть любым. Если же интерфейс описан дважды - в клиентской части и в серверной, или если вы создаёте клиента для уже существующего сервиса с определённым Namespace, то Namespace должны совпадать, чтобы клиент и сервер понимали друг-друга, иначе будет ответ
... ... The message could not be processed because the action 'http://tempuri.org/ISomeWcf/GetResultHttpGet' is invalid or unrecognized.

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

Отправить комментарий