次のコードが別の c# アプリケーションを呼び出してファイルをダウンロードし、ディスクに保存する .Net Web API アプリケーションを作成しています。すべてが正常に機能してファイルを取得できる場合もありますが、以下のコードでストリームを読み取ることができず、他のアプリケーションでリモート接続が閉じられたという例外が表示されることがあります。
public async Task<string> GetFilePathAsync(TestModel model)
{
string filePath = string.Empty;
var response = await cgRequestHelper.DownloadAsync(model);
if (response.IsSuccessStatusCode)
{
filePath = await SaveCgStreamAsync(cgResponse, serviceModel.FileName);
}
return filePath;
}
public async Task<HttpResponseMessage> DownloadAsync(TestModel model)
{
if (model == null)
throw new ArgumentNullException("model");
if (string.IsNullOrEmpty(model.Url))
throw new ArgumentNullException("Url");
if (model.Headers == null)
throw new ArgumentNullException("Headers");
HttpResponseMessage response;
using (HttpClient httpClient = new HttpClient())
{
foreach (var header in model.Headers)
{
httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}
response = await httpClient.GetAsync(model.Url, HttpCompletionOption.ResponseHeadersRead);
}
return response;
}
public async Task<string> SaveCgStreamAsync(HttpResponseMessage response, string fileName)
{
if (response == null)
throw new ArgumentNullException("response");
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException("fileName");
var filePath = _CreateTemporaryLocation(fileName);
Stream cgStream = null;
Stream fileStream = null;
try
{
cgStream = await response.Content.ReadAsStreamAsync();
fileStream = File.Open(filePath, FileMode.Create);
await cgStream.CopyToAsync(fileStream);
}
catch(Exception e)
{
throw;
}
finally
{
if(cgStream != null)
cgStream.Dispose();
if(fileStream != null)
fileStream.Dispose();
}
return filePath;
}
Global.asax.cs で ServicePointManager.DefaultConnectionLimit = 1000 を設定しました
私の現在のアプリケーションでは、「await cgStream.CopyToAsync(fileStream);」で例外が発生しています。cgStream を読み取ろうとすると行が表示されます。例外は、「閉じられたストリームにアクセスできません」です。with null InnerException もう 1 つのアプリケーション例外は次のとおりです。 System.Web.HttpException: リモート ホストが接続を閉じました。エラー コードは 0x800703E3 です。System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError (Int32 結果、ブール値 throwOnDisconnect) で System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush() で System.Web.HttpResponse.Flush (ブール値 finalFlush、ブール値 async)
平均して、10 件中 1 件のリクエストが上記のエラーで失敗しています。これはランダムであり、常に失敗するとは限らないため、問題のトラブルシューティングは非常に困難です。
この問題に関連するヘルプは大歓迎です!
ありがとう