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 服务 [重复]