我创建了一个简单的DispatchMessageInspector。 问题是当XML格式错误时不会调用检查器。 RAW XML也可能出现格式错误的XML语法调用吗?
public class WcfMessageDebugger : IDispatchMessageInspector, IServiceBehavior
{
/// <summary>
/// Log4net logger
/// </summary>
private ILogger Logger { get; set; }
public WcfMessageDebugger(ILogger logger)
{
Logger = logger;
}
object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
if (Logger != null)
{
var textMessage = request.ToString();
// HERE NOT PASS WHEN XML IS MALFORMED
Logger.Debug(textMessage);
}
return null;
}
void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
if (Logger != null)
{
Logger.Debug(reply.ToString());
}
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
// non necessario
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
foreach (var endpoint in dispatcher.Endpoints)
{
var debugger = new WcfMessageDebugger(Logger);
endpoint.DispatchRuntime.MessageInspectors.Add(debugger);
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
我还更改了web.config中没有结果的选项
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"/>
</diagnostics>
答案 0 :(得分:1)
是的,但您必须将其作为IIS模块执行。编写一个自定义HTTP模块,它将捕获所有异常,然后让模块在遇到格式错误的XML时做出反应。请参阅this我回答的有关如何执行此操作的问题。