1

Microsoft テクノロジに基づいていない http rest エンドポイントで動作する WCF クライアントを作成しようとしています。私の 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 バイトは次のとおりです。

Web ブラウザーから (別の資格情報を使用して) これにアクセスしようとすると、探している xml ドキュメントが取得されます... https://sendgrid.com/api/filter.getavailable.xml?api_user=foo&api_key =バー

私は間違って何をしていますか?

編集:

これが最終的な実用的な解決策でした...

    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;
        }
    }
4

1 に答える 1

2

クライアント側では、REST バインディングではなく SOAP バインディングである BasicHttpBinding を使用しています。代わりに WebClient クラスを使用してみてください

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

または WebChannelFactory

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

于 2012-01-19T20:18:21.137 に答える