Asp.net web api 为什么HttpRequestMessage如此有限?

Asp.net web api 为什么HttpRequestMessage如此有限?,asp.net-web-api,Asp.net Web Api,我正在做我的第一个ASP.NET Web API项目,我有一个自定义授权属性正在工作。我要做的是设置该属性,以便如果请求是本地的(即调试),则绕过授权检查 在所有其他ASP.NET MVC版本中,我可以检查Request.IsLocal(甚至Request.UserHostAddress)以查看请求是否来自本地计算机,但System.Web.Http.AuthorizeAttribute仅公开HttpRequestMessage对象,该对象显然没有这些信息,而且似乎还缺少了请求对象中的一些其他内

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

在所有其他ASP.NET MVC版本中,我可以检查Request.IsLocal(甚至Request.UserHostAddress)以查看请求是否来自本地计算机,但System.Web.Http.AuthorizeAttribute仅公开HttpRequestMessage对象,该对象显然没有这些信息,而且似乎还缺少了请求对象中的一些其他内容


如何处理用于web API的一整套新类(显然是有限的),或者更直接地说,如何在“授权”属性中获取被调用方的主机地址?

有几个不同的示例可以获取您想要的请求信息,例如

如果这真的只是为了调试,那么在任何只调试的代码周围使用这样的条件语句可能会更安全-尤其是在安全上下文中

#if DEBUG 
// 
#endif 

至于为什么…我想这至少部分是为了便于单元测试和模拟,HTTP上下文是ASP.NET System.Web构造。。。WebApi被设计为能够作为独立于ASP.NET的自托管代码运行

有两个不同的示例可以获取您想要的请求信息,例如

如果这真的只是为了调试,那么在任何只调试的代码周围使用这样的条件语句可能会更安全-尤其是在安全上下文中

#if DEBUG 
// 
#endif 

至于为什么…我想这至少部分是为了便于单元测试和模拟,HTTP上下文是ASP.NET System.Web构造。。。WebApi被设计为能够作为独立于ASP.NET的自托管代码运行

我在开发多个中间件组件,或支持其他做出不幸的IIS绑定决定的人使用HttpContext或依赖HttpContext时遇到了同样的问题,无论是直接通过HttpContext还是通过MS_HttpContext(在self-host中这不是一个选项)。我编写了一个小的垫片库,通过返回一个在这两种情况下都能工作的HttpContext来解决这个问题。你可以在网上找到它

Install-Package HttpContextShim

我在开发多个中间件组件,或支持其他人做出不幸的IIS绑定决定使用HttpContext或依赖HttpContext时遇到了同样的问题,无论是直接通过HttpContext还是通过MS_HttpContext(这在self-host中不是选项)。我编写了一个小的垫片库,通过返回一个在这两种情况下都能工作的HttpContext来解决这个问题。你可以在网上找到它

Install-Package HttpContextShim

+最后一点意见。事实上,Web API是一种通用解决方案,而IIS上的ASP.NET只是它可以运行的三种上下文之一(Web托管、自托管、内存托管)。很长一段时间以来,ASP.NET本身就可以在控制台或服务应用程序中托管。我不确定这是做出这种改变的最重要原因,但也许新的产品解决了一些我不知道的旧方法的问题。获取客户的地址似乎是一个基本的共同要求,令人震惊的是MS没有建立一个简单的方法来直接实现这一点。最后的评论是+1。事实上,Web API是一种通用解决方案,而IIS上的ASP.NET只是它可以运行的三种上下文之一(Web托管、自托管、内存托管)。很长一段时间以来,ASP.NET本身就可以在控制台或服务应用程序中托管。我不确定这是做出这种改变的最重要原因,但也许新的产品解决了一些我不知道的旧方法的问题。获取客户机地址似乎是一个基本的通用要求,令人震惊的是MS没有内置一个简单的方法来直接完成。它是有限的,因为这些属性不属于HTTP规范的一部分,因此不在范围内。HttpWebRequest/HttpWebResponse的问题是它们成了所有东西的巨大容器。根本没有分离关注点。也许这在2013年不可用。。。使用:requestMessage.GetRequestContext().IsLocalIt是有限的,因为这些属性不是HTTP规范的一部分,因此不在范围内。HttpWebRequest/HttpWebResponse的问题是它们成了所有东西的巨大容器。根本没有分离关注点。也许这在2013年不可用。。。使用以下命令:requestMessage.GetRequestContext().IsLocal