Совместимость WCF с другими сервисами, тип контента text / html - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь создать клиент WCF, который работает с конечной точкой отдыха http, не основанной на технологиях Microsoft.Мой WCF-foo довольно слабый, поэтому я не понимаю, что делаю неправильно ... Я создал сервисный контракт, который выглядит следующим образом ...

[ServiceContract]
public interface IFilters
{
    [OperationContract]
    [WebGet(UriTemplate = "/api/filter.getavailable.xml?api_user={username}&api_key={password}")]
    String GetAvailableFilters(String username, String password);
}

Который я пытаюсь запуститьвот так ...

    public String Run(String username, String password)
    {
        var binding = new BasicHttpBinding();
        binding.MessageEncoding = WSMessageEncoding.Text;
        binding.Security.Mode = BasicHttpSecurityMode.Transport;

        var endpointAddress = new EndpointAddress("https://sendgrid.com");

        IFilters proxy = ChannelFactory<IFilters>.CreateChannel(binding, endpointAddress);
        var result = "";
        using (proxy as IDisposable)
        {
            result = proxy.GetAvailableFilters(username, password);
        }
        return result;
    }

Когда я запускаю этот код, я получаю исключение, которое говорит ...

Тип содержимого text / html;charset = utf-8 ответного сообщения не соответствует типу содержимого привязки (text / xml; charset = utf-8).При использовании пользовательского кодировщика убедитесь, что метод IsContentTypeSupported реализован правильно.Первые 1024 байта ответа были: ...

Теперь, если я просто попытаюсь получить доступ к нему из веб-браузера (с другими учетными данными), я получу искомый документ xml... https://sendgrid.com/api/filter.getavailable.xml?api_user=foo&api_key=bar

что я делаю неправильно?

Редактировать:

Это было окончательное рабочее решение ...

    public Filters Run(String username, String password)
    {
        var binding = new WebHttpBinding(WebHttpSecurityMode.Transport);
        var endpointAddress = new EndpointAddress("https://sendgrid.com");
        var factory = new ChannelFactory<IFilters>(binding, endpointAddress);
        factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
        var proxy = factory.CreateChannel();
        using (proxy as IDisposable)
        {
            var results = proxy.GetAvailableFilters(username, password);
            return results;
        }
    }

1 Ответ

2 голосов
/ 20 января 2012

На стороне клиента вы используете BasicHttpBinding, который является SOAP-привязкой, а не REST-привязкой. Вместо этого вы должны попробовать использовать класс WebClient

http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx

или WebChannelFactory

http://msdn.microsoft.com/en-us/library/bb908674.aspx

...