【问题标题】:Wcf : Where are all the responses going?Wcf:所有响应都去哪儿了?
【发布时间】:2018-04-05 09:02:43
【问题描述】:

我有一些这样实现的 REST Web 服务:

[ServiceContract]
public interface IRESTService
{
    [WebGet(UriTemplate = "GetEveryone", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    EveryoneDTO GetEveryone();
}

public class RESTService : IRESTService
{
    public EveryoneDTO GetEveryone()
    {
        // [...] Some processing
        return everyone;
    }
}

我的everyone 对象要去哪里?我的意思是,必须发生一些事情才能将对象转换为 JSON 并发送它们。我的调试不会让我更进一步。

我对此感兴趣是因为,比方说,我想处理我发回的每个对象中包含的每个字符串(可能是出于编码目的),我将如何/在哪里能够实现拦截每个对象的中间件和可以在发送之前轻松更改它们吗?

【问题讨论】:

标签: c# rest wcf


【解决方案1】:

一个好的解决方案是实现一个自定义消息检查器
根据客户端或服务器端,您可以实现两个接口:

IClientMessageInspector 用于客户端,IDispatchMessageInspector 用于服务器。您可以在同一个类和程序集上实现两者并使用更方便的方法,因为消息检查器是扩展,您可以配置(例如 Web.config)您想要使用的。

IDispatchMessageInspector 实现了AfterReceiveRequestBeforeSendReply 方法,因此您可以在收到请求时和发送回复之前截取消息,对您的场景非常有用。

这是MSDN message-inspectors 文档

一个简单的实现示例:

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
        request = buffer.CreateMessage();
        var m = buffer.CreateMessage().ToString();
        return null;
    }

请注意,您必须复制原始消息,以便提取 XML 并将其转换为对象(日志、更改等)

【讨论】:

    【解决方案2】:

    如果我理解得很好,您希望在将 WCF 数据输出发送到您的客户端之前拦截它。

    有多种方法可以做到这一点,下面的链接就是其中之一:

    https://www.codeguru.com/csharp/.net/net_wcf/learn-to-create-interceptors-in-wcf-services.htm

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2011-03-03
      • 2014-03-15
      • 2015-07-17
      相关资源
      最近更新 更多