3


1

WebDavを介してファイルをIIS 6サーバーにアップロードする必要がある.NET 2.0 WinFormsアプリがあります。 時々私達は遠隔オフィスからそれらが次のエラーメッセージのうちの1つを受け取るという苦情を受けます

  • 基になる接続が閉じられました。送信時に予期しないエラーが発生しました。

  • 基礎となる接続が閉じられました。受信時に予期しないエラーが発生しました。

これは大きなファイル(〜20Mb以上)でのみ起こるようです。 私は自宅のコンピューターの40Mbのファイルでテストし、遅い接続をシミュレートするために 'Sleep’をループに入れようとしました。 しかし

  1. リモートオフィスのITは役に立ちません

  2. 私のコードが間違っている可能性を排除したいのです。

そのため、この問題に対してコードを「防弾」する可能性のある間違いを見つけたり、回避策を提案したりできます。 助けてくれてありがとう。 コードのバージョンを切り落としたものは次のとおりです。

public bool UploadFile(文字列localFile、文字列uploadUrl){HttpWebRequest req =(HttpWebRequest)WebRequest.Create(uploadUrl);

{req.Method = "PUT";を試してください。 req.AllowWriteStreamBuffering = true; req.UseDefaultCredentials = Program.WebService.UseDefaultCredentials; req.Credentials = Program.WebService.Credentials; req.SendChunked = false; req.KeepAlive = true; Stream reqStream = req.GetRequestStream(); FileStream rdr = new FileStream(localFile、FileMode.Open、FileAccess.Read); byte [] inData = new byte [4096]; int bytesRead = rdr.Read(inData、0、inData.Length);

while(bytesRead> 0){reqStream.Write(inData、0、bytesRead); bytesRead = rdr.Read(inData、0、inData.Length); }

reqStream.Close(); rdr.Close();

System.Net.HttpWebResponse response =(HttpWebResponse)req.GetResponse(); if(response.StatusCode!= HttpStatusCode.OK

6 Answer


6


http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.keepalive.aspx[KeepAlive]をfalseに設定してみてください。
req.KeepAlive = false;

これにより、接続を閉じて再度開くことができます。 永続的な接続を使用することはできません。 私はあなたのエラーに類似したものを解決するためにこれを提案するWebで多くの参照を見つけました。 これは関連する linkです。

とにかく、大きなファイルをアップロードするためにHTTP PUT(またはHTTP POST)を使用することはお勧めできません。 FTPまたはダウンロード/アップロードマネージャを使用することをお勧めします。 これらは再試行、接続の問題、タイムアウトを自動的に処理します。 アップロードも速くなりますし、アップロードの中止を再開することもできます。 HTTPを使い続けることにした場合は、少なくとも再試行メカニズムを追加するようにしてください。 アップロードに時間がかかりすぎる場合は、プロキシ、サーバーのタイムアウト、ファイアウォール、またはコードを使用しない理由が原因で失敗する可能性が高くなります。


5


コードのバグのリスクを取り除くには、http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx [+ WebClient +]を使用してみてください。

using (WebClient client = new WebClient())
{
    client.UseDefaultCredentials = Program.WebService.UseDefaultCredentials;
    client.Credentials = Program.WebService.Credentials;
    client.UploadFile(uploadUrl, "PUT", localFile);
}


1


たぶんPOSTを使ってみてくださいが、本当の原因はおそらくコンテンツタイプです。

設定してみてください

req.ContentType = "application / octet-stream"; req.ContentLength = inData.Length;

またはここで承認された回答のコードを見てください。

私の例と私が提供したリンクの両方ともContentTypeを修正することを含みます - 私の例はより単純ですがファイルを受け取るほとんどのアプリケーションがマルチパートを期待するのでうまくいかないかもしれません


1


IISマネージャの[Webサイト]タブで[Httpキープアライブを有効にする]が[オン]に設定されているか確認してください。


0


アップロードのサイズが制限されている可能性があります。

1つの議論のためにここに見なさい:http://www.codeproject.com/KB/aspnet/uploadlargefilesaspnet.aspx


0


いくつかの基本設定をチェックすることから始めます。 次のいずれかのデフォルト値は、ファイルのアップロード(接続の終了など)に問題を引き起こす可能性があります。 IIS 6では、2 GBを超えるファイルのアップロードは許可されません(設定に関係なく、完了できたとしても)。 Msdnはこれらをうまく説明しています


編集:これはもちろん、あなたがあなた自身のwebdavサーバーまたは サードパーティサーバーをASP.NET内で実行していると仮定して、ASP.NET設定です。 それが別のWebDAVサーバであるなら、あなたは同等物を探すことを望むでしょう。