我在WCF中编写了一个简单的REST API,并且身份验证机制使用API密钥。一旦客户端在请求头中提交API密钥,我在服务器端(在覆盖RequestInterceptor类的ProcessRequest()方法的BaseService类中)检查它,如下所示:
public partial class BaseService : RequestInterceptor
{
public BaseService() : base(false) { }
#region Process Request
public override void ProcessRequest(ref RequestContext requestContext)
{
if (IsValidApiKey(requestContext))
//put some values in HttpContext object.
}
...
现在我在REST服务中启用了aspnet兼容性,但我仍然无法在上面的ProcessRequest覆盖中访问HttpContext对象。 请注意,可以从服务方法内部访问HttpContext,但不能在ProcessRequest方法中访问。
任何想法为什么?
答案 0 :(得分:1)
HttpContext可能稍后在WCF通道堆栈中初始化。请记住,通道拦截器先在通道堆栈中运行,然后在从Http通道侦听器接收到消息之后运行。从请求拦截器访问HttpContext需要什么? Http请求在与requestContext关联的消息中作为属性提供。您还可以在消息中可用的属性包中添加商店一些值。
由于 巴勃罗。
答案 1 :(得分:1)
我通过添加以下代码解决了我的问题:
private HttpContext _httpContext;
public BaseService()
: base(true)
{
_httpContext = HttpContext.Current;
}
执行此操作后,我可以在ProcessRequest方法中访问HttpContext对象。
答案 2 :(得分:1)
但是你应该注意到HttpContext.Current不是线程安全的,用一个线程设置的东西可以被另一个线程修改。
例如,两个请求来到您的服务。您为RequestInterceptor中的第一个请求的HttpContext添加了一些值。第二个请求等待,直到第一个请求未完成RequestInterceptors。如果第一个请求以RequestInterceptors结束并传递给您服务,则第二个请求进入RequestInterceptors,并且如果第一个请求未完成,则可以访问第一个请求设置的HttpContext。这是我遇到的一个问题。