Как отлавливать и регистрировать ошибки ASP.NET / WCF Bad запросов? - PullRequest
0 голосов
/ 24 апреля 2011

Я хочу перехватить все ошибки «http 400 Bad request», которые отправляются в мою веб-службу WCF4 (REST), и в настоящее время все неверные запросы (возможно, ошибка в xml / json) просто перенаправляются на общий неверный запрос IIS 400 страница ошибки.

Ни Application_Error в global.asax, ни пользовательский переопределенный обработчик страниц ошибок 400 в IIS не вызывались.

Так есть ли другой способ отловить ошибки в WCF?

1 Ответ

2 голосов
/ 31 октября 2011

Я сам смотрел на это и то, как я его отсортировал, реализуя System.ServiceModel.Dispatcher.IErrorHandler:

public class EventLogErrorHandler : BehaviorExtensionElement, IErrorHandler, IServiceBehavior
{
    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        var log = new EventLog("APPLICATION",Environment.MachineName, "SomeSourceName");
        log.WriteEntry("PROVIDING FAULT", EventLogEntryType.Information);
    }

    public bool HandleError(Exception error)
    {
        var log = new EventLog("APPLICATION", Environment.MachineName, "SomeSourceName");
        log.WriteEntry(error.ToString(), EventLogEntryType.Error);
        return true;
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {

    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {

    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (var dispatcher in serviceHostBase.ChannelDispatchers)
            (dispatcher as ChannelDispatcher).ErrorHandlers.Add(this);
    }

    protected override object CreateBehavior()
    {
        return new EventLogErrorHandler();
    }

    public override Type BehaviorType
    {
        get { return GetType(); }
    }
}

Затем я могу добавить это в тег system.serviceModel внутри тега расширений, как показано ниже:

<extensions>
  <behaviorExtensions>
    <add name="errorhandler" type="SomeAssembly.SomeNamespace.EventLogErrorHandler, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>

Наконец, добавьте это поведение к поведению ваших сервисов, и когда возникнет какая-либо ошибка, вы можете добавить правильную логику для обработки по своему усмотрению:

...
                <errorhandler />
            </behavior>
        </serviceBehaviors>
    </behaviors>

Надеюсь, это поможет,

Andrew

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...