1

この例に基づいた単純な Web API プロジェクトがあります: http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/RelaySample/Program.cs

ただし、上記のサンプルでは、​​リレーはローカル サーバーで動作しています。私のプロジェクトでは、リレーは実際のアドレスを持つ外部 Web サーバーで動作しています。companyX.com

ブラウザ経由でリレー サービス (ま​​たは Web プロキシ サービス) を使用しています (たとえば、ブラウザ リクエストの relayService.com/companyX)。リレー サービスは、外部の companyX.com サイトからのデータで応答します。

リレーはうまく機能しますが、一部のヘッダーが正しくないため、HttpClient がリモートの companyX.com サーバーに何を送信しているかを確認する必要があります。

フィドラーまたはチャールズでは、ブラウザからrelayService.comへのリクエスト/レスポンスのみがリストされ、HttpClientからrelayService.comへのリクエスト/レスポンスは表示されません。

RelayService.com は私のマシンでローカルに実行されています。IIS7 では、hosts ファイルを使用してトラフィックを relayService.com に転送しています。

HttpClient を作成するときに、次のいくつかのバリエーションを試しました。

        var clientHandler = new HttpClientHandler
        {
            CookieContainer = cookies,
            UseCookies = true,
            UseDefaultCredentials = false,
            Proxy = new WebProxy("http://localhost:8888"),
            UseProxy = true,
            AutomaticDecompression = DecompressionMethods.GZip, 
            AllowAutoRedirect = false, 
            ClientCertificateOptions = ClientCertificateOption.Automatic
        };


        HttpClient client = new HttpClient(clientHandler);

アップデート

変更UseProxy = falseすると、Fiddler が開いていても閉じていても、サービスは引き続き機能します。

UseProxy = trueその後、サービスは失敗します。フィドラーが開いていると、次のエラーが表示されます。

Object reference not set to an instance of an object.

at System.DomainNameHelper.IdnEquivalent(String hostname) at System.Net.HttpWebRequest.GetSafeHostAndPort(Uri sourceUri, Boolean addDefaultPort, Boolean forcePunycode) at System.Net.HttpWebRequest.GenerateProxyRequestLine(Int32 headersSize) at System.Net.HttpWebRequest.SerializeHeaders() at System.Net.HttpWebRequest.EndSubmitRequest() at System.Net.Connection.CompleteConnection(Boolean async, HttpWebRequest request)

UseProxy = trueフィドラーが閉じていると、次の(明らかな)エラーが発生します。

No connection could be made because the target machine actively refused it 127.0.0.1:8888

同じソリューションで、HttpWebRequest を使用して Web からデータをダウンロードしていますが、それが Fiddler に表示されるため、HttpClient.GetAsync() に問題があるようです。

2台のマシンでこれを試しましたが、同じ結果が得られました。

私は一日中これに苦労してきました。どんな助けでも大歓迎です。

要約すると: * RelayService.com は、IIS7 の私のマシンでローカルに実行されています。

  • hostsファイルには「127.0.0.1 relayService.com」があります

  • RelayService.com は、HttpClient.GetAsync() を使用してライブ Web からコンテンツをダウンロードする MVC Web API サイトです。

  • Fiddler/Charles は同じマシンでローカルに実行されています

  • ローカルの RelayService.com へのブラウザ トラフィックが Fiddler/Charles に表示される

  • ライブ Web トラフィックへの HttpClient.GetAsync() が Fiddler/Charles に表示されない

  • Fiddler/Charles はどちらも最新バージョンです。

再度、感謝します

4

2 に答える 2

0

Fiddler を使用している場合、HOSTS ファイルには何も必要ありません。Fiddler の Tools > HOSTS を使用して、トラフィックを好きな場所にリダイレクトできます。

サービス アカウント (ASP.NET アカウントなど) からトラフィックをキャプチャしようとする場合、通常は、プロキシを使用するようにそのアカウントを構成する必要があります。詳細については、 http://fiddler2.com/blog/blog/2013/01/08/capturing-traffic-from-.net-services-with-fiddlerを参照してください。これを行う場合、プロキシ オブジェクトをコードで直接構成する必要はありません。

あなたが示した例外は、ここに GenerateProxyRequestLine 関数のバグがあることを示唆しています。これを に更新すると何か変化はありますnew WebProxy("http://localhost:8888");new WebProxy("127.0.0.1", 8888);?

一般的に言えば、.NET アプリケーションは //localhost または //127.0.0.1 を指す URL のプロキシをバイパスするため、Fiddler を使用してデバッグする場合は、//localhost.fiddler のサービス URL を使用して、トラフィックが常にプロキシ。

于 2013-07-25T03:11:46.313 に答える
0

HttpClient を静的にすることで問題を修正しました。

これは (プログラムの機能に関しては) 正常に動作しますが、上記のフィドラーに問題があり、プロキシを使用しようとするとエラーがスローされます。

private HttpClient _client()
{

    var clientHandler = new HttpClientHandler
    {
        UseCookies = true,
        UseDefaultCredentials = false,
        Proxy = new WebProxy("http://localhost:8888"),
        UseProxy = true,
        AutomaticDecompression = DecompressionMethods.GZip,
        AllowAutoRedirect = true,
        ClientCertificateOptions = ClientCertificateOption.Automatic
    };

    HttpClient client = new HttpClient(clientHandler);
    client.Timeout = TimeSpan.FromMinutes(20);

    return client;
}

クライアントは次のように作成されました。

using (HttpResponseMessage serviceResponse = await _client().GetAsync(getURL(), HttpCompletionOption.ResponseHeadersRead))
    {
                // Return response

    }

ただし、以下も機能し、すべてのトラフィックが Fiddler に表示されます!

private static readonly HttpClientHandler _clientHandler = new HttpClientHandler()
{
    //CookieContainer = cookies,
    UseCookies = true,
    UseDefaultCredentials = false,
    Proxy = new WebProxy("http://localhost:8888"),
    UseProxy = false,
    AutomaticDecompression = DecompressionMethods.GZip,
    AllowAutoRedirect = false,
    ClientCertificateOptions = ClientCertificateOption.Automatic, 
};

//Create a shared instance of HttpClient and set the request timeout
private static readonly HttpClient _client = new HttpClient(_clientHandler)
{
    Timeout = TimeSpan.FromMinutes(20)
};

クライアントは次のように作成されました (違いは、上記の _client の後の '()' を削除することだけです):

using (HttpResponseMessage serviceResponse = await _client.GetAsync(getURL(), HttpCompletionOption.ResponseHeadersRead))
    {
                // Return response

    }

なぜこれが機能するのかわかりません。任意の洞察をいただければ幸いです。

ありがとう、

于 2013-07-26T00:37:26.330 に答える