【问题标题】:"Cannot redirect after HTTP headers have been sent." When returning HttpResponseMessage with HttpStatusCode.Unauthorized“发送 HTTP 标头后无法重定向。”使用 HttpStatusCode.Unauthorized 返回 HttpResponseMessage 时
【发布时间】:2023-03-27 15:55:01
【问题描述】:

我正在使用新的 Web Api 测试版并希望返回

HttpResponseMessage<MyObject>(new MyObject{ MyMessage = "Go Away!" }, HttpStatusCode.Unauthorized)

来自我的 ApiController 操作之一。

Forms Authentication 劫持响应、崩溃并将错误 "Cannot redirect after HTTP headers have been sent." 添加到响应中。

this 等普通抑制技术不适用于 Web Api。

有没有人找到解决这个问题的方法?

我查看了this forum post,人们报告了同样的问题,但那里的解决方案不适用于这种情况。建议的第一个解决方案使用了对 web api 不起作用的正常抑制技术。第二个使用 HttpMessageHandler 在请求到达控制器之前拦截请求,我希望控制器正常触发。

查看DelegatingHandler 后,我可以访问HttpResponseMessage,但不知道如何处理以阻止FormsAuth 重定向。

【问题讨论】:

  • 解释为什么建议的解决方案不起作用在这里可能会有所帮助。
  • @Maurice 好主意,我已经更新了问题
  • 那么为什么像 Phil Haack 博客文章中提到的那样的正常抑制技术有效?它们适用于 WebAPI 等 REST 服务。
  • @Maurice 我不知道,web api 返回正确的 401,但将错误 html 添加到响应中。 Phil Haacks 代码对 web api 操作没有影响。它着火但无济于事。单步执行它,它还会在response.StatusCode = 401; 上崩溃,并显示“服务器无法在发送 HTTP 标头后设置状态。”。 response.StatusCode 此时已经是 401,所以我认为错误发生在管道中的其他地方。
  • Phil 的帖子指出是 FormsAuthenticationModule 将 401 更改为 302。您声称删除 FormsAuthenticationModule 对您没有任何影响。现在我并不是说您不需要 FormsAuthenticationModule 。但是话又说回来,您的帖子中也没有任何关于使用它的内容。但是,您的错误听起来像是在将 401 更改为 302 时导致 FormsAuthenticationModule 失败。

标签: c# asp.net-mvc-4 asp.net-web-api


【解决方案1】:

我在使用Phil Haack's SuppressFormsAuthenticationRedirectModule时遇到了同样的问题

我设法通过清除服务器的错误来修复它,如下所示

private void OnEndRequest(object source, EventArgs args)
{
    var context = (HttpApplication)source;
    var response = context.Response;

    if (context.Context.Items.Contains(SuppressAuthenticationKey))
    {
        context.Server.ClearError(); //Clearing server error

        response.TrySkipIisCustomErrors = true;
        response.ClearContent();
        response.StatusCode = 401;
        response.RedirectLocation = null;
    }
}

【讨论】:

  • 这对我来说非常适合 ASP.NET Web API。我只需要使用context.Server.ClearError(); 我有条件地从我的 Global.asax.cs Application_PostRequestHandlerExecute 方法中调用它。这阻止了 ASP.NET 在我的 JSON 响应之后附加重定向 HTML。
【解决方案2】:

您好,这个问题似乎还没有解决,我想我要指出的是,最新的 MVC 4 RC 版本现在似乎默认禁用了表单重定向。我在回复这个问题时做了一些挖掘Prevent FormsAuthenticationModule of intercepting ASP.NET Web API responses

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2011-08-04
    • 2010-09-14
    • 2014-06-10
    • 2019-12-29
    相关资源
    最近更新 更多