Есть хорошие и плохие новости.Хорошей новостью является то, что ваш код работал бы, если бы ваша конфигурация была правильной.Я предоставлю исправление через минуту.Плохая новость заключается в том, что это решение может быть нестабильным.Согласно документации MSDN, метод ProvidFault не гарантированно выполняется в том же потоке, что и операция службы , и, таким образом, доступ к чему-то вроде WebOperationContext.Current
может быть наездом.
Тем не менее, вот что исправит вас:
Вы не видите ожидаемых результатов, потому что ваша конфигурация неверна.Ваша конфигурация правильно объявляет расширение, но не беспокоится о том, что любые конечные точки должны его использовать.Между двумя звездочками есть исправление, которое я вставил в вашу конфигурацию:
<system.serviceModel>
<!-- ****************** -->
<behaviors>
<serviceBehaviors>
<behavior>
<errorHandler />
</behavior>
</serviceBehaviors>
</behaviors>
<!-- ****************** -->
<extensions>
<behaviorExtensions>
<add name ="errorHandler" type="ACME.MyErrorHandlerElement, ACME.MyErrorHandler"/>
</behaviorExtensions>
</extensions>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" faultExceptionEnabled="false" helpEnabled="false" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
Другая проблема, с которой вы можете столкнуться, заключается в том, что в вашей конфигурации активирован режим совместимости asp.net.Когда этот режим включен, у меня были проблемы с установкой моего поведения.Ваш пробег может варьироваться.
И последнее: если, несмотря на предупреждение из документации MSDN, вы хотите продолжить свой подход, я предлагаю вам сделать расширение IErrorHandler примерно так:
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var faultEx = error as FaultException;
bool isRest = version == MessageVersion.None;
if (isRest && faultEx == null)
{
OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
if (response.StatusCode == HttpStatusCode.BadRequest) {
response.StatusCode = HttpStatusCode.InternalServerError;
}
}
}
Приведенный выше код гарантирует, что вы не сможете случайно переопределить код состояния, который был явно установлен разработчиком сервисной операции.Это также позволяет ошибкам WebFaultException, выдаваемым разработчиком, распространяться с любым кодом состояния, назначенным разработчиком.