web-dev-qa-db-ja.com

C#で高速Webリクエストを実行する方法

私は潜在的に何度も呼び出す必要があるHTTPベースのAPIを持っています。問題は、ブラウザーを介して行われる同じ要求はほぼ瞬時ですが、要求を約20秒未満で取得できないことです。次のコードは、これまでにどのように実装したかを示しています。

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla");
var response = r.GetResponse();

解決策の1つは非同期リクエストを作成することですが、なぜこれに時間がかかるのか、また回避できるかどうかを知りたいです。私もWebClientクラスを使用してみましたが、内部的にWebRequestを使用していると思います。

更新:

次のコードの実行には、リリースモードで約40秒かかりました(ストップウォッチで測定)。

WebRequest g = HttpWebRequest.Create("http://www.google.com");
var response = g.GetResponse();

私は大学で働いていて、パフォーマンスに影響を与えるネットワーク構成が異なる可能性がありますが、ブラウザを直接使用すると、ほぼ瞬時に動作するはずです。

更新2:

コードをリモートマシンにアップロードしましたが、正常に機能しました。そのため、.NETコードはブラウザーに比べて何か特別なことをするか、大学のネットワークを介してアドレスを解決するのに問題がある(プロキシの問題か何か?!).

28

この問題は、StackOverflowの別の投稿に似ています: Stackoverflow-2519655(HttpWebrequestが非常に遅い)

ほとんどの場合、問題はプロキシサーバーのプロパティです。このプロパティはnullに設定する必要があります。そうしないと、オブジェクトはソースに直接移動する前に、使用する適切なプロキシサーバーを検索しようとします。注:このプロパティはデフォルトでオンになっているため、このプロキシ検索を実行しないようにオブジェクトに明示的に指示する必要があります。

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}
30
James Roland

「最初の」試行で30秒の遅延がありました-JamesRがプロキシをnullに設定することについて言及している他の投稿への参照はそれを即座に解決しました!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url);
request.Proxy = null; // <-- this is the good stuff

...

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
13
Dave Amphlett

サイトに無効なSSL証明書がありますか?これを追加してみてください

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept);

//... somewhere AlwaysAccept is defined as:

using System.Security.Cryptography.X509Certificates;
using System.Net.Security;

public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}
3
Philip Rieck

あなたはあなたの要求を閉じません。許可された接続の数に達したらすぐに、以前の接続がタイムアウトするのを待つ必要があります。試す

using (var response = g.GetResponse())
{
    // do stuff with your response
}
2
Nicolas78