通过WebAPI

时间:2017-03-23 01:33:25

标签: c# asp.net angular asp.net-web-api file-upload

你好吗?

我在Angular2中创建了一个表单,它使用表单数据发送POST请求并将文件上传到webapi控制器。 但是我有一点问题。

我系统的一些用户(访问我公司网络以外的系统)在20%的尝试中提交表单,发生错误(我在NLog注册)。 但是,如果我尝试在公司网络中提交具有相同数据和相同文件的表单,那么一切都很完美(100%尝试)。

然而,错误是间歇性的,它平均发生在10个请求中的2个,并且只发生在公司网络外部访问系统的用户。

我的C#控制器: `public async Task PostFormData(){         HttpResponseMessage响应;

    try
    {
            if (!Request.Content.IsMimeMultipartContent())
            {
                    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);

            var fileContent = provider.Contents.FirstOrDefault(x => x.Headers.ContentType != null &&
                                    (x.Headers.ContentType.MediaType.StartsWith("image/") ||
                                     x.Headers.ContentType.MediaType.Equals("application/pdf")));

            // Function to transform form content in object                         
            var transaction = await FormObject<Product>(provider);

            // Performs data processing, etc...
     }

}`

错误发生在该行:

Await Request.Content.ReadAsMultipartAsync (provider);

文件上传限制为5Mb(在Angular2中),在WebConfig中,我限制了请求的大小,上传到30Mb(留下一定的松弛)。

发生的异常如下:

System.Net.Http.HttpContentMultipartExtensions.d__8.MoveNext()中的

StackTrace: ---从抛出异常的先前位置开始的堆栈跟踪结束---    在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)    在System.Net.Http.HttpContentMultipartExtensions.d__0`1.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束---    在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)    在Sisprec.Api.Controllers.TransacaoController.d__12.MoveNext()

InnerException: System.Web.HttpException(0x800703E3):客户端已断开连接。    在System.Web.Hosting.IIS7WorkerRequest.EndRead(IAsyncResult asyncResult)    在System.Web.HttpBufferlessInputStream.EndRead(IAsyncResult asyncResult)    在System.Threading.Tasks.TaskFactory 1.FromAsyncTrimPromise 1.Complete(TInstance thisRef,Func`3 endMethod,IAsyncResult asyncResult,Boolean requiresSynchronization) ---从抛出异常的先前位置开始的堆栈跟踪结束---    在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)    在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)    在System.Net.Http.HttpContentMultipartExtensions.d__8.MoveNext()

现在我不知道该怎么做。

非常感谢您的帮助。

0 个答案:

没有答案