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