次のコードを考えます。
public static void Upload(Uri target, Stream content)
{
var request = (HttpWebRequest)WebRequest.Create(target);
request.UseDefaultCredentials = true;
request.Method = WebRequestMethods.Http.Put;
request.ContentType = "application/octet-stream";
using (Stream requestStream = request.GetRequestStream())
{
content.CopyTo(requestStream);
}
using (var response = (HttpWebResponse)request.GetResponse())
{
}
}
特定のシナリオで予期していなかった結果が表示されています。
アップロード リクエストのターゲットは SharePoint システムです。リクエストがタイムアウトするのに十分な大きさのファイルをアップロードすると、WebException
(予想どおり) "The operation timed out" というメッセージと共に がスローされます。これまでのところすべて順調です。
奇妙なことに、同じコードを再実行すると (新しいプロセスであっても)、別のタイムアウトで再び失敗した後、ファイルが実際に宛先に表示されます。ダウンロードでき、完全に無傷のように見えるため、破損したり、部分的にアップロードされたりしているようには見えません。
これが発生しないようにするために、リクエストを作成するときに指定する必要があるものは他にありますか? タイムアウトが発生した場合にHEADのみのリクエストを実行して、ファイルが実際に作成されたことを確認することでこれを回避できることはわかっていますが、可能であればもう少し堅牢なものを希望します。