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

时间:2012-02-24 15:44:14

标签: c# wcf

我需要一个我创建的WCF服务才能进入“只读”模式。在此状态下,它不会为将对数据库进行更改的调用请求(如创建订单)提供服务,但只会为只读请求(如身份验证用户)提供服务。如果它收到一个它不会服务的请求,它需要传回一个友好的消息和代码(例如CODE:100,DESCRIPTION:“Service处于只读模式,不能为此请求提供服务”)。

我有近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,只要我不必在每次服务调用中处理只读检查/响应,那就没问题。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

HttpHandler to hook the *.svc requests

答案 1 :(得分:1)

您可以使用custom ServiceAuthorizationManager实现此目的。

这个想法将是

  • 为处于只读模式时要禁用的每个类添加自定义属性
  • 在自定义ServiceAuthorizationManager中,检查服务是否处于只读模式。如果是,请检查您尝试呼叫的方法的自定义属性。该方法由请求消息动作头指示。服务的类型可以从OperationContext.InstanceContext找到(我想 - 我不记得具体属性)
  • 如果找到该属性,请使用正确的错误消息抛出错误异常。