我遇到的情况让 asp.net web api 有点烦人。问题是我有一个已经投入生产的 API,但是我不断地进行更改和再次部署。
我有一个过滤器,它负责检查请求是否为 https,这在生产中非常有用,但是当请求是本地的时,过滤器会阻止所有 http 请求,这不是我想要的。我想允许使用 http 的本地请求。我有一个过滤器,它在 MVC3 上做同样的事情,我可以做类似的事情:
filterContext.HttpContext.Request.IsLocal
有没有办法解决这个问题?
我遇到的情况让 asp.net web api 有点烦人。问题是我有一个已经投入生产的 API,但是我不断地进行更改和再次部署。
我有一个过滤器,它负责检查请求是否为 https,这在生产中非常有用,但是当请求是本地的时,过滤器会阻止所有 http 请求,这不是我想要的。我想允许使用 http 的本地请求。我有一个过滤器,它在 MVC3 上做同样的事情,我可以做类似的事情:
filterContext.HttpContext.Request.IsLocal
有没有办法解决这个问题?
如果您使用的是 webhost,即在 asp.net 中托管 webapi,您可以使用访问 HttpContext
HttpContextBase httpContextBase;
request.Properties.TryGetValue("MS_HttpContext", out httpContextBase);
然后,您可以使用httpContextBase.Request.IsLocal
来确定请求是否是本地的。
您可以使用扩展方法来访问 Request.Properties 字典中的值。例如:
public static class HttpRequestExtensions
{
public static bool IsLocal(this HttpRequestMessage request)
{
var flag = request.Properties["MS_IsLocal"] as Lazy<bool>;
return flag != null && flag.Value;
}
}
这具有在自托管时也可以工作的额外好处。
您可以直接使用HttpRequestMessage的IsLocal扩展方法。关联
例如:
using System.Net.Http;
...
public void PostUser(User user)
{
if (!base.Request.IsLocal())
{
...
MS_Islocal 属性对我不可用,而是这有效 -
if (Request != null && Request.Properties.ContainsKey("MS_RequestContext")){
var context = Request.Properties["MS_RequestContext"] as HttpRequestContext;
return context.IsLocal;
}
return false;