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

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

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

【问题讨论】:

    标签: c# wcf asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

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

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

      public class ClientMessageLogger : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            string outputstr = $"Server reply message received by the client:\n{reply}\n";
            Console.WriteLine(outputstr);
        }
    
        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            string outputText = $"The request message that the client will send:\n{request}\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:\n{request}\n";
                Console.WriteLine(displayText);
                return null;
            }
    
            public void BeforeSendReply(ref Message reply, object correlationState)
            {
                string displayText = $"Server reply message:\n{reply}\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 一起使用,请在您的回答中提供一个示例
    猜你喜欢
    • 2018-01-07
    • 2023-03-28
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2018-04-19
    相关资源
    最近更新 更多