WCF中的HttpContext
我已经在WCF中编写了一个简单的REST API,并且认证机制使用了一个API密钥。 一旦客户端在请求头中提交了API密钥,我将在服务器端进行检查(在BaseService类中覆盖RequestInterceptor类的ProcessRequest()方法),如下所示:
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方法中访问。
任何想法为什么?
HttpContext可能在WCF频道堆栈中稍后初始化。 请记住,通道拦截器在通道堆栈中运行之前,以及刚收到来自Http通道侦听器的消息之后。 你需要从请求拦截器访问HttpContext? Http请求作为与requestContext关联的消息中的属性提供。 您还可以在消息中的可用属性包中添加一些存储值。
谢谢巴勃罗。
我通过添加以下代码解决了我的问题:
private HttpContext _httpContext;
public BaseService()
: base(true)
{
_httpContext = HttpContext.Current;
}
这样做后,我可以访问ProcessRequest方法中的HttpContext对象。
但是,您应该注意到HttpContext.Current不是线程安全的,使用一个线程设置的内容可以由另一个线程修改。
例如两个请求来到您的服务。 您为第一个请求在RequestInterceptor的HttpContext中添加了一些值。 第二个请求等待,直到第一个请求未完成RequestInterceptors。 如果第一个请求使用RequestInterceptors完成并传递给您的服务,则第二个请求将进入RequestInterceptors,如果第一个请求未完成,则可以访问由第一个请求设置的HttpContext。 这是我遇到的一种问题。
链接地址: http://www.djcxy.com/p/4567.html上一篇: HttpContext in WCF
下一篇: How to bitblit from RenderTargetBitmap to WriteableBitmap?