15

HttpWebRequestを使用して特定のサーバーにファイルをアップロードしていますが、速度の問題が発生しています。

ブラウザ(Mozilla Firefox)で取得するのと同じアップロード速度を取得できません。取得する速度は、ブラウザから取得する速度の1/5です。

これが私のHttpWebRequestオブジェクトの設定です

//headers is a NameValueCollection type object,
//Method is a struct { GET, POST, HEAD }

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.UserAgent = headers["User-Agent"];
        request.KeepAlive = false;
        request.Accept = headers["Accept"];
        request.AllowAutoRedirect = AllowRedirect;
        request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.5");
        request.Method = Method.ToString();
        request.AllowWriteStreamBuffering = false;
        request.ReadWriteTimeout = 60000;

私が有効にしていたいくつかのグローバルオプション

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 200;
        ServicePointManager.MaxServicePointIdleTime = 2000;
        ServicePointManager.MaxServicePoints = 1000;
        ServicePointManager.SetTcpKeepAlive(false, 0, 0);

ファイルをチャンクで送信する方法...

            if (PostMethod == PostType.MultiPart && uploadFiles.Count > 0)
            {
                for (int i = 0; i < uploadFiles.Count; i++)
                {
                    string fileParam = uploadFiles.GetKey(i);
                    string tmpFilename = uploadFiles.Get(i);
                    string tmpData =
                    string.Format(
                        "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", boundary, fileParam, Path.GetFileName(tmpFilename), MimeType.GetMimeByExtension(Path.GetExtension(tmpFilename)));
                    byte[] tmpBytes = Encoding.Default.GetBytes(tmpData);
                    writer.Write(tmpBytes, 0, tmpBytes.Length);
                    bSent += tmpBytes.Length;

                    arg.Progress = (int)(bSent * 100 / totalBytes);
                    arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                    OnProgress(arg);

                    //write the file
                    int fileBytesRead;

                    FileStream fileStream = File.Open(tmpFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
// buffer size = 8192
                    while ((fileBytesRead = fileStream.Read(buffer, 0, BUFFER_SIZE)) > 0) 

                    {
                        writer.Write(buffer, 0, fileBytesRead);
                        bSent += fileBytesRead;

                        int timeNow = Environment.TickCount;
                        if (timeNow - lastTime >= 500)
                        {
                            lastTime = timeNow;
                            arg.Progress = (int)(bSent * 100 / totalBytes);
                            arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                            OnProgress(arg);
                        }
                    }

                    tmpBytes = Encoding.Default.GetBytes("\r\n");
                    writer.Write(tmpBytes, 0, tmpBytes.Length);
                    bSent += tmpBytes.Length;

                    arg.Progress = (int)(bSent * 100 / totalBytes);
                    arg.Speed = (bSent / sw.Elapsed.TotalSeconds);
                    OnProgress(arg);

                }
            }

ブラウザのアップロード速度の75%でも達成できれば幸いです。

4

3 に答える 3

7

このサイトを検索して答えを見つけました。「.NETHttpWebRequestSpeedvsBrowser」の複製のようです。

そこに投稿された回答から:

「最初にページをリクエストすると、.netはプロキシ設定を検出しようとします。解決策は空のWebProxyオブジェクトを渡すことです。この方法では、プロキシサーバーを自動検出するのではなく、リモートサーバーに接続するだけです。」-マルコス

追加してみてください

    request.Proxy = new WebProxy();
于 2013-03-09T03:24:23.860 に答える
2

2つのこと。

  1. チャンキングによって TCP/IP スタックの目的を無効にしています。TCP/IP は、ほぼ非同期のデータ転送を処理するように設計されています。独自のチャンキングを行い、終了するか未確認チャンクの最大数に達するまでチャンクを送信し続けます。チャンクの最大数に達すると、ACK(承認) が継続するのを待ちます - セマフォのイデオロギーと同様に、リリースを「スタック」できることを期待します。AKA 単一の ACK には、受信した最後のポイントが含まれ、「解放」できます。 /acknowledge 複数のチャンク パケット) - または要求がタイムアウトします。

    自分でチャンク化すると、各チャンクはデータを送信するために完全に確認する必要があるため、オーバーヘッドが増加します。同じ接続を引き続き使用していますが、基本的に複数の個別のリクエストを作成しています。さらに、TCP/IP チャンク サイズがチャンク サイズの約数でない場合 (YOUR_CHUNK_SIZE % TCP_IP_CHUNK_SIZE != 0)、タイムアウトして疑似 ACK に解決しなければならない TCP/IP チャンクが残っていることになります。次のチャンクで次にできるときに確認されます。

  2. 2.

パフォーマンスに影響を与える可能性がある別のオプションは、UseNagleAlgorithm プロパティの使用です。このプロパティーがtrueに設定されている場合、TCP/IP は HTTP 接続に TCP Nagle アルゴリズムを使用しようとします。Nagle アルゴリズムは、TCP パケットの送信時にデータを集約します。データがネットワーク経由で送信される前に、小さなメッセージのシーケンスを大きな TCP パケットに蓄積します。Nagle アルゴリズムを使用すると、ネットワーク リソースの使用を最適化できますが、状況によってはパフォーマンスが低下することもあります。一般に、一定の大量スループットの場合、パフォーマンスの向上は Nagle アルゴリズムを使用して実現されます。ただし、スループットの小さいアプリケーションでは、パフォーマンスの低下が見られる場合があります。

通常、アプリケーションは、 trueに設定されているUseNagleAlgorithmプロパティのデフォルト値を変更する必要はありません。ただし、アプリケーションが低遅延接続を使用している場合は、このプロパティをfalseに設定すると役立つ場合があります。

MSDN から: HttpWebRequest クラス (System.Net)

于 2013-03-14T20:47:50.900 に答える
1

ここでは、アップロード速度を上げることができるさまざまなオプションを使用しています:-

http://bytes.com/topic/asp-net/answers/440179-how-speed-up-file-upload-2-0-a

大きなファイルの構成ファイルでこれを使用します:---

これを web 構成 system.web> に書き込みます

httpRuntime maxRequestLength="2097151"

これは、IIS 7.0 で解決策を見つけるのに役立つ場合があります。

これを web 構成 system.web>httpModules に記述します。

**add name="ITHitPutUploadProgressAndResumeModule" type="ITHit.WebDAV.Server.ResumableUpload.PutUploadProgressAndResumeModule, ITHit.WebDAV.Server"**
于 2013-03-14T12:46:37.187 に答える