【发布时间】: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