WCF - 拦截消息并发送自定义响应

3
我有一个对我创建的WCF服务的要求,希望能进入“只读”模式。在这种状态下,它不会为那些会对数据库进行更改的请求提供服务(例如创建订单),但只会为只读请求提供服务(例如验证用户)。如果它收到一个它无法服务的请求,它需要返回一个友好的消息和代码(例如CODE:100,DESCRIPTION:“服务处于只读模式,无法服务此请求”)。
我有近100个不同的调用,并希望实现一个可以在一个地方(例如IDispatchMessageInspector)中完成的解决方案,但我看不到一种方法来对拦截的WCF消息提供响应。我有一个标准的响应类型,我在所有请求中都发送回来,并希望在这些情况下也发送回去。该类型名为ServiceResponse,具有消息集合,其中包含代码和描述的类。
public class ServiceResponse
{
    public List<Message> Messages {get; set;}
}

public class Message
{
    public string Code {get; set;}
    public string Description {get; set;}
}

有人能为我提供如何做到这一点的方向吗?我已经用尽了所有搜索选项。

即使在WCF中只有一种手动创建发送回来的SOAP的方法,只要我不必在每个服务调用中处理只读检查/响应,那就没问题了。

谢谢!


你的所有操作是否都返回“ServiceResponse”,或者将其添加到接口中是问题的一部分? - dice
它们目前都返回一个ServiceResponse。我提到它是一个要求是因为消费者需要能够预期与他们已经期望的相同类型的结果。 - omatase
我正在使用Ninject及其拦截插件处理请求,做了类似的事情。根据规模的大小,将IOC容器添加到现有的代码库中可能并不容易,但这是一个选择。 - Jonathan S.
嗯,我一直想学习Ninject,但是对于这么小的项目,我可能没有足够的带宽去做那个。 - omatase
在我看来,一个小项目是学习 Ninject 的好起点! :) - Jonathan S.
2个回答

1
我看到了几个选择。1)将功能添加到服务实现中(100个),2)找到一个面向方面的工具,在运行时拦截服务调用并执行不同的代码,或者3)使用自定义HTTP处理程序拦截所有wcf请求。在处理程序中,您可以处理请求并将响应返回给客户端。这里是一些可能有帮助的链接。

http://blogs.msdn.com/b/wenlong/archive/2007/09/18/how-to-use-asmx-extension-to-handle-wcf-requests.aspx

使用 HttpHandler 钩取 *.svc 请求


1

您可以使用自定义ServiceAuthorizationManager来实现此功能。

实现思路如下:

  • 为每个要在只读模式下禁用的类添加自定义属性
  • 在自定义的ServiceAuthorizationManager中,检查服务是否处于只读模式。如果是,则检查您要调用的方法上是否有自定义属性。该方法由请求消息操作标头指示。服务类型可以从OperationContext.InstanceContext中找到(我想 - 我不记得确切的属性)
  • 如果找到属性,则抛出带有正确错误消息的故障异常。

我可以使用这个来返回一个响应对象而不是抛出异常吗?我想要返回我的响应对象。 - omatase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接