获取格式错误的XML语法调用的RAW XML

时间:2014-05-19 18:38:29

标签: c# xml wcf

我创建了一个简单的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>

1 个答案:

答案 0 :(得分:1)

是的,但您必须将其作为IIS模块执行。编写一个自定义HTTP模块,它将捕获所有异常,然后让模块在遇到格式错误的XML时做出反应。请参阅this我回答的有关如何执行此操作的问题。