2013-07-16 2 views
0

Я закончил стучать головой по клавиатуре для этого.Странное поведение с свойством UriTemplate WCF WebGetAttribute

У меня есть a WCF client project, который может быть использован для использования в службе Yahoo GeoPlanet. Одним из конечных точек для свободного текста запросов могут быть представлены следующим образом:

[OperationContract(Name = "places")] 
[WebGet(
    UriTemplate = "places.q({query});count=0?format=json&view={view}&appid={appId}", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Bare 
)] 
PlacesResponse Places(string query, string appId, RequestView view); 

Существует реализация этого, что вызывает клиент WCF (более или менее) следующим образом: (есть повторить здесь логику, но это является то, что она сводится к тому)

public Places Places(string query, string appId, RequestView view = RequestView.Long) 
{ 
    return Channel.Places(HttpUtility.UrlEncode(query), appId, view); 
} 

проблема заключается в том, что, даже если параметр query является URL кодируется, к тому времени WCF выдает фактический запрос HTTP, значение %2F преобразуется обратно в косую черту (/). В результате поиски, такие как "Saint Augustine Tunapuna/Piarco, Trinidad and Tobago", (по понятным причинам) отклоняются с 400 Bad Request сервером Yahoo.

Худшая часть этого заключается в том, что это происходит только тогда, когда клиентская библиотека используется как ссылка на визуальный проект студии. У меня есть следующий тест в проекте, который всегда проходит:

[TestMethod] 
public void Yahoo_GeoPlanet_GeoPlanetClient_Places_ShouldUrlEncodeQuery_WhenItContainsUnsafeCharacters() 
{ 
    using (var geoPlanetClient = new GeoPlanetClient()) 
    { 
     var places = geoPlanetClient.Places("Saint Augustine Tunapuna/Piarco, Trinidad and Tobago", AppId); 

     places.ShouldNotBeNull(); 
     places.Items.Count.ShouldBeInRange(1, int.MaxValue); 
    } 
} 

Когда я использую эту библиотеку в другом проекте, она работает только тогда, когда клиент .csproj является частью решения другого проекта, и упоминается как ссылка на проект. Как только я включаю его как пакет NuGet или ссылку на файл dll, он терпит неудачу.

Я ушел в код, и кажется, что URL-адрес правильно закодирован к моменту его передачи в Channel. Однако когда-то после этого %2F в строке поиска преобразуется обратно в косую черту. Единственная причина, по которой я это знаю, - это проверить запрос в скрипаче.

ответ

0

Возможно, подумайте об использовании HttpClient? Это намного проще.

+0

Согласовано, 'HttpClient' или' WebClient' было бы проще, если бы у меня было время или деньги, чтобы вернуться и переписать эту библиотеку. Он был унаследован и изменен с http://www.codeproject.com/Articles/30627/GeoNames-NET-WCF-Client и со ВСЕЙ ОТВЕТСТВЕННОСТЬЮ, потому что я думаю, что вы потрясающий, и я попросил вас ответить на этот вопрос , это все равно не помогает с ошибкой. – danludwig

Смежные вопросы