Страницы

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

воскресенье, 8 марта 2020 г.

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

#c_sharp #wcf


Добрый день.

Я здесь с вопросом, который никак самостоятельно не могу осознать.


  Вопрос: что такое 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 делать? Такое впечатление что рядом брожу с
ответом, а сформулировать его не могу.

Спасибо
    


Ответы

Ответ 1



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.

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

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