C# 中 WCF 和 MVC Web API 的通用请求响应拦截器

Posted

技术标签:

【中文标题】C# 中 WCF 和 MVC Web API 的通用请求响应拦截器【英文标题】:Common request response interceptor for WCF and MVC Web API in C# 【发布时间】:2021-05-05 07:29:05 【问题描述】:

一些背景: 我们有很多 Web API 和服务项目,其中一些在 WCF 中,其中一些在 MVC Web API 框架中。我的意图是为所有这些开发一个通用的请求/响应拦截器库,它可以记录请求和响应我在实际项目中所做的简约更改。 我知道我们可以使用 ActionFilters for MVC Web APIs 和 WCF 中的 MessageInspector 来完成这项任务。

我的问题: 是否可以为 MVC WebAPI 和 WCF 服务创建一个通用的请求/响应拦截器库?如果不是,我认为我必须创建两个不同的库来实现我的目标。

【问题讨论】:

【参考方案1】:

在客户端实现IClientMessageInspector接口,在服务器端实现IDispatchMessageInspector接口。您可以拦截请求和回复。

这是客户端上的示例代码:

  public class ClientMessageLogger : IClientMessageInspector

    public void AfterReceiveReply(ref Message reply, object correlationState)
    
        string outputstr = $"Server reply message received by the client:\nreply\n";
        Console.WriteLine(outputstr);
    

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    
        string outputText = $"The request message that the client will send:\nrequest\n";
        Console.WriteLine(outputText);
        return null;

    

[AttributeUsage(AttributeTargets.Interface)]
public class CustomBehavior : Attribute, IContractBehavior

    public Type TargetContract => typeof(ServiceReference1.ICalculator);
    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    
        return;
    

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    
        clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
    
    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
    
        return;
    

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
    
        return;
    

这是服务器上的示例代码:

 public class CustomMessageInspector : IDispatchMessageInspector
    
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        
            string displayText = $"The request message received by the server:\nrequest\n";
            Console.WriteLine(displayText);
            return null;
        

        public void BeforeSendReply(ref Message reply, object correlationState)
        
            string displayText = $"Server reply message:\nreply\n";
            Console.WriteLine(displayText);
        
    
    [AttributeUsage(AttributeTargets.Interface)]
    public class CustomBehavior : Attribute, IContractBehavior
    
        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        
            return;
        

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        
            return;
        
        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        
            dispatchRuntime.MessageInspectors.Add(new CustomMessageInspector());
        

        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        
            return;
        
    

最后需要在界面上方申请[CustomBehavior]

【讨论】:

我相信这只有在 WCF 而不是 MVC Web API 项目的情况下才有可能,我的理解不正确吗? 可以在MVC中使用。 我测试过,它不适用于 MVC,对于 MVC,我们必须使用 DelegateHandler 或 ActionFilter。如果您认为它可以与我们使用控制器的 MVC Web API 一起使用,请在您的回答中提供一个示例

以上是关于C# 中 WCF 和 MVC Web API 的通用请求响应拦截器的主要内容,如果未能解决你的问题,请参考以下文章

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

新电子商务网站的 WCF vs WEB api vs Web 服务 [重复]

集成 Web API 和 .net MVC 项目 (C#)

ASP.NET MVC API 或 WCF API

C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换

WCF => MVC 作为 ASP.NET WebServices => ASP.NET Web 应用