为什么HttpRequestMessage如此有限?

时间:2012-08-13 05:51:39

标签: asp.net-web-api

我正在开发我的第一个ASP.NET Web API项目,并且我有自定义授权属性。我想要做的是设置属性,以便如果请求是本地的(即调试),则绕过授权检查。

在所有其他ASP.NET MVC版本中,我可以检查Request.IsLocal(甚至是Request.UserHostAddress)以查看请求是否来自本地计算机,但System.Web.Http.AuthorizeAttribute仅公开HttpRequestMessage对象,显然没有这些信息,似乎也从Request对象中遗漏了一些其他东西。

与Web API一起使用的全新(显然有限的)类的处理是什么,也许更直接地说,如何在Authorize属性中获取被调用者的主机地址?

2 个答案:

答案 0 :(得分:5)

有几个不同的例子可以抓取您想要的请求信息herehere,例如

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var context = actionContext.Request.Properties["MS_HttpContext"] as System.Web.HttpContextBase;
        bool isLocal = context.Request.IsLocal;

如果这真的只是用于debuging,那么在任何仅调试代码中使用这样的条件语句可能更安全 - 特别是在安全上下文中......

#if DEBUG 
// 
#endif 

至于为什么...... 我想这至少部分是为了让更简单的单元测试和模拟,HTTP Context是一个ASP.NET System.Web构造...... WebApi是旨在作为独立于ASP.NET的自托管代码运行。

答案 1 :(得分:0)

我在开发多个中间件组件时遇到了同样的问题,或支持其他人做出不幸的,IIS绑定决定使用HttpContext,或依赖它,无论是直接通过HttpContext还是通过MS_HttpContext(这不是一个选项)在自我主持人)。我写了一个小的shim库来解决这个问题,给你一个在两种情况下都能工作的HttpContext。您可以在github和NuGet

上找到它
Install-Package HttpContextShim