如何清理webapi中的现有响应?

时间:2016-05-06 09:32:26

标签: c# asp.net-web-api2

我必须使用一个身份验证库来帮助完成

之类的操作
Response.Redirect(url, false);

在它的方法调用中。我不能改变这个库代码,它适用于MVC风格的应用程序,但在角度SPA - > WebApi应用程序这很糟糕。

我真的需要一个401,否则当我的角度脚本使用$ http尝试调用另一个域上的auth服务器来响应302时,我会遇到CORS问题,如果它甚至可以作为{{ 1}}也会向下发送Response.Redirect html,尖括号会导致错误抛出。

由于我必须首先调用auth库,object moved已经在响应管道中,所以我需要清理它以删除正文内容并将302转换为401.我想我可以:

Response.Redirect

但这只是附加到响应并且不替换它,而且我还需要Location:标头,我似乎无法通过WebApi方法访问它。

所以我必须在我的ApiController中执行此操作:

return new HttpWebResponse(StatusCode.UnAuthorized){
         Content = new StringContent("data");
}

但这似乎很糟糕,与webapi“感觉”相反。另外,我这样做与控制器联系在一起。例如,我无法在MessageHandler中获取包装器。

我想要做的是监视消息处理程序或AuthorizationFilterAttribute中给定路由的响应,如果它是302,我想读取它的标题,取我想要的,擦除它并替换它我自己作为401的“新鲜”回应。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您可能想要编写自己的ActionFilter并覆盖其 OnActionExecuted 方法,您可以访问 HttpActionExecutedContext 。从那里,您可以检查响应代码,例如,并用您想要的任何内容覆盖响应。

参考:https://msdn.microsoft.com/en-us/library/system.web.http.filters.actionfilterattribute.onactionexecuted%28v=vs.118%29.aspx#M:System.Web.Http.Filters.ActionFilterAttribute.OnActionExecuted%28System.Web.Http.Filters.HttpActionExecutedContext%29