在上传文件时,服务器无法在HTTP标头发送后添加标头。

18

我在我的ASP.NET MVC 5 C# Web应用程序中偶尔遇到此异常:

服务端无法在HTTP头已发送后追加头信息。

它只是在将图片上传到S3方法(Web API 控制器)时发生。

Global.asax 中的 presendrequestheaders。

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            if (app != null &&
                app.Context != null)
            {
                app.Context.Response.Headers.Remove("Server");
            }
        }
触发错误的方法:
    [HttpPost]
    [Route("UploadImageJSON")]
    public IHttpActionResult UploadImageJSON(HttpRequestMessage request)
    {
        var httpRequest = HttpContext.Current.Request;

        // Check if files are available
        if (httpRequest.Files.Count != 1) return BadRequest();

        var postedFile = httpRequest.Files[0];

        var contentType = postedFile.ContentType;
        if (!contentType.Contains("image"))
        {
            return StatusCode(HttpStatusCode.NotAcceptable);
        }




        var keyUploadFiles = Constants.UrlS3Amazon +
                             S3.UploadToS3WithStream(postedFile.InputStream, contentType);


        return Json(JsonConvert.SerializeObject(keyUploadFiles));


    }

编辑:更多信息... 我的Web应用程序托管在Elastic BeanStalk中,使用负载均衡器,负载均衡器安装了SSL证书,并且负载均衡器与EC2实例之间的连接位于端口80。这可能会有所帮助。

Elmah日志:

System.Web.HttpException (0x80004005): 在HTTP标头已发送后,服务器无法追加标头。 at System.Web.HttpHeaderCollection.SetHeader(String name, String value, Boolean replace) at Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Set(String key, String[] values) at Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeaderUnmodified(IDictionary`2 headers, String key, String[] values) at Microsoft.Owin.ResponseCookieCollection.Append(String key, String value, CookieOptions options) at Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.<ApplyResponseGrantAsync>d__b.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<ApplyResponseCoreAsync>d__8.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<TeardownAsync>d__5.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.d__0.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.d__0.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.d__0.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext() --- 前一个位置引发异常的堆栈跟踪结束 --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

谢谢!


每次使用您的方法上传图像时都会出现这个问题吗?因为您在开头说这是一个间歇性问题... - D4rkTiger
你有任何HTTP模块让响应通过吗? - hivie7510
3
您的堆栈跟踪显示代码经过了 Microsoft.Owin.Security.Infrastructure.AuthenticationMiddlewareMicrosoft.Owin.Security.Cookies.CookieAuthenticationHandler。您的身份验证流程是如何设置的? - MarioDS
1
好问题。我遇到了一个类似的间歇性错误,据我所知与我的任何代码都没有关系,但是它具有相同的堆栈,包括 Microsoft.Owin.SecurityMicrosoft.AspNet.Identity.Owin 方法调用。在我的情况下,“流程是如何设置的?”就是“它是如何从 AspNet.Identity 盒子中出来的”。 - fortboise
看起来异常发生在你的UploadToS3WithStream方法中,所以你需要展示该方法的代码。 - SeanN
1个回答

1

你尝试过使用 app.Context.Response.Headers.Remove("Server"); 移除吗?我认为这可能是问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接