2

我正在研究 .net web api 中的一些 Restful API。我正在处理的所有 API 控制器都继承自基本 API 控制器。它在 Initialize 函数中有一些逻辑。

protected override void Initialize(HttpControllerContext controllerContext)
{
// some logic
}

有一个新的产品需求出现,我想根据某些标准在 Initialize 函数中将响应返回给客户端。例如

 protected override void Initialize(HttpControllerContext controllerContext)
{
// some logic
   controllerContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "error");

}

但是,即使我已经返回响应,.net 管道似乎仍在继续。

无论如何要在该函数内返回响应并停止执行?或者我必须重构现有代码以另一种方式来做?

4

3 回答 3

5

这是完成您想要的事情的一种hacky方式。像这样抛出异常。

protected override void Initialize(HttpControllerContext controllerContext)
{
       // some logic
       if(youhavetosend401)
           throw new HttpResponseException(HttpStatusCode.Unauthorized);
}

更简洁的方法,假设你想要做的都是关于授权的,就是像这样创建一个授权过滤器。

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext context)
    {
        // Do your stuff and determine if the request can proceed further or not
        // If not, return false
        return true;
    }
}

将过滤器应用于操作方法或控制器,甚至全局。

[MyAuthorize]
public HttpResponseMessage Get(int id)
{
     return null;
}
于 2013-10-19T13:56:40.980 回答
0

使用 HttpResponseException 发送为 Error 创建的 HttpResponseMessage。

protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
{ 
   //Your Logic
   throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.Unauthorized, "error"));
   base.Initialize(controllerContext);
}
于 2013-10-20T09:25:29.547 回答
-1

使用 Application.CompleteRequest() 它将触发 EndRequest 事件。

于 2013-10-20T09:33:45.597 回答