Моя команда недавно реорганизовала службу веб-API, чтобы переместить часть повторяющегося кода в статические методы. Один метод связан с извлечением загруженного файла из запроса. Метод работает в модульном тестировании, но под нагрузкой бросает исключения. Часть кода была найдена в сообщении SO, но я обеспокоен тем, что в целом мы не используем его правильно. Вот код:Ошибка чтения WebAPI MIME partpart body part
internal static string ExtractFile(HttpRequestMessage request)
{
if (request.Content.IsMimeMultipartContent())
{
string uploadRoot = ServiceHelper.GetUploadDirectoryPath();
var provider = new MultipartFormDataStreamProvider(uploadRoot);
try
{
Task.Factory
.StartNew(() => provider = request.Content.ReadAsMultipartAsync(provider).Result,
CancellationToken.None,
TaskCreationOptions.LongRunning, // guarantees separate thread
TaskScheduler.Default)
.Wait();
}
catch(System.AggregateException ae)
{
if(log.IsErrorEnabled)
{
foreach(var ex in ae.InnerExceptions)
{
log.Error("ReadAsMultipartAsync task error.", ex);
}
}
var errorResponse = request.CreateErrorResponse(HttpStatusCode.InternalServerError, "An error occurred while extracting the uploaded file from the request.");
throw new HttpResponseException(errorResponse);
}
var fileData = provider.FileData.First();
var localName = fileData.LocalFileName;
var content = File.ReadAllText(localName);
if (log.IsDebugEnabled)
{
var embeddedName = fileData.Headers.ContentDisposition.FileName;
log.DebugFormat("File {0} was successfully uploaded as '{1}'.", embeddedName, localName);
}
return content;
}
else
{
log.Error("Invalid request received. Request must be in a multipart/form-data request.");
var errorResponse = request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Request must be a multipart/form-data request and contain one file.");
throw new HttpResponseException(errorResponse);
}
}
Прогулка через бревна, я вижу ошибки, подобные этим:
System.IO.IOException: Ошибка чтения MIME многочастному части тела. ---> System.IO.IOException ---> System.Net.HttpListenerException: Операция ввода/вывода была прервана из-за выхода потока или по запросу приложения
HttpListenerRequest расположенного
System.IO .IOException: Ошибка чтения MIME частичной части тела. ---> System.IO.IOException ---> System.Net.HttpListenerException: была предпринята операция по несуществующему сетевому подключению
Эта веб-служба работает как автономная служба Windows OWIN. Загрузка файлов небольшая (от 3k до 4k).
Я не могу воссоздать проблему с одной загрузкой. Клиент, который разговаривает с сервисом, использует задачи для отправки файлов, но обычно он запускает более 4 или 5 задач одновременно. Моя команда и я относительно новичок в задачах .NET. Один из разработчиков задается вопросом, действительно ли параметр TaskCreationOptions.LongRunning наносит боль больше, чем помогает. Какие-либо предложения?
Update:
Я попытался переключения вне Task.Factory код с этим:
var task = Task.Run(async() => await request.Content.ReadAsMultipartAsync(provider));
task.Wait();
provider = task.Result;
Я до сих пор некоторые проблемы, но это, кажется, работает лучше. Не знаю, почему.
Может проверить конфигурацию Owin для тайм-аута/keep- живые настройки? Возможно, это может быть вызвано медленными/пятнистыми соединениями? – MiltoxBeyond