【问题标题】:WCF - Intercepting a Message and Sending a Custom ResponseWCF - 拦截消息并发送自定义响应
【发布时间】:2012-02-25 05:04:44
【问题描述】:

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

我有近 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”,或者是否将其添加到您的界面部分?
  • 它们当前都返回一个 ServiceResponse。我将其作为一项要求提到的原因是因为消费者需要能够期望他们已经期望的相同类型的结果。
  • 我正在使用 Ninject 及其拦截插件来处理请求。根据大小,将 IOC 容器添加到现有代码库中可能并非易事,但这是一种选择。
  • 嗯,我一直想学习 Ninject,但对于这么小的项目,我可能没有足够的时间来学习。
  • IMO - 一个小项目是开始学习 Ninject 的好地方! :)

标签: c# wcf


【解决方案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

【讨论】:

    【解决方案2】:

    您可以通过custom ServiceAuthorizationManager 实现此目的。

    这个想法是

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

    【讨论】:

    • 我可以用它来传回响应对象而不是抛出异常吗?我想传回我的响应对象。
    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2015-09-27
    • 2013-08-15
    • 1970-01-01
    • 2022-07-02
    相关资源
    最近更新 更多