WCF客户端单点阻止/过滤传出请求

时间:2015-11-29 17:21:14

标签: wcf

我在WCF客户端中寻找单点,我可以在其中过滤传出请求。我正在将用户会话信息注入我的请求中。标题,如果用户会话信息不可用,我想阻止/中止发送消息。我到处寻找,无法找到合适的解决方案。我有一个IClientMessageInspector,它负责注入会话信息,但是我找不到从IClientMessageInspector中止消息的方法。

关于如何从IClientMessageInspector取消消息:How to cancel a request in BeforeSendRequest,2年前还有一个未解决的问题。这不是重复,因为我也可以通过更好/其他方式实现单点客户端消息过滤,而不一定通过IClientMessageInspector。

到目前为止我尝试过的事情:

  • 将请求转为null,会生成异常。
  • 使用request.Close关闭请求会生成异常。 (我实际上看过一个反编译的RequestChannel类的源代码,看它是否有任何方式只会中止消息,而不会抛出异常,并且无法找到方法)。
  • 关闭/中止频道,会产生异常。
  • 无法找到一种方法来挂钩错误处理,以阻止上述异常之一,就像你可以在服务器端使用IErrorHandler接口一样。
  • 尝试覆盖请求,并将其设为空请求,从服务器
  • 收到500错误

仅供参考,这是我的BeforeSendRequest(IClientMessageInspector):

public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
    {
        if (UserContext.CurrentUser != null && UserContext.CurrentSessionId != Guid.Empty)
        {
            var headerToAttach = new RequestObject()
            {
                UserId = UserContext.CurrentUser.Id,
                SessionToken = UserContext.CurrentSessionId
            };

            var wcfHeader = MessageHeader.CreateHeader("SessionHeader", "sessions", headerToAttach);
            request.Headers.Add(wcfHeader);
        }
        else if (request.Headers.Action.Split('/').Last().ToLower() != "login")
        {
            // How to abort the request?
        }

        return null;
    }

0 个答案:

没有答案