我对 WebApi 的异步文件上传功能有疑问。
目前我可以使用提供程序保存文件,但是我想使用服务(_myService)来记录上传文件的文件名。在服务内部,它使用另一个服务来获取当前的 UserId。它通过使用当前的 HttpContext 来做到这一点。不幸的是,当前的 HttpContext 似乎在新任务线程中丢失了。
我尝试添加 TaskScheduler.FromCurrentSynchronizationContext() 作为任务的第二个参数,但这没有效果。不太确定这给了我什么。所以我需要某种方式将 Http 上下文传递到新线程。我将如何实现这一目标?
[ValidationFilter]
public Task<FileUpModel> Upload([FromUri]int ReportType, [FromUri]string LocationDescription, string AdditionalInformation)
{
if (Request.Content.IsMimeMultipartContent())
{
var imagePath = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MyFormDataStreamProvider(imagePath);
var task = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(
t =>
{
if (t.IsFaulted || t.IsCanceled)
throw new HttpResponseException(HttpStatusCode.InternalServerError);
var fileInfo = provider.FileData.FirstOrDefault();
if (fileInfo == null)
throw new HttpResponseException(HttpStatusCode.InternalServerError);
// httpContext is lost here...
_myService.LogUploadedFile(fileInfo.LocalFileName);
var uploadModel = new FileUpModel { success = true };
return uploadModel;
}, TaskScheduler.FromCurrentSynchronizationContext());
return task;
}
else
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
}
}