Странное поведение с помощью свойства UriTemplate WCF WebGetAttribute

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

У меня есть клиентский проект WCF, который можно использовать для обслуживания сервиса 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" (по понятным причинам) отклоняются сервером Yahoo с ошибкой 400 Bad Request.

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

[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 в строке поиска превращается обратно в косую черту. Единственная причина, по которой я это знаю, - проверка запроса в фиддлере.

1 ответ

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

Другие вопросы по тегам