Я хочу написать IErrorHandler реализацию, которая будет обрабатывать AuthenticationException
экземпляры (собственный тип), а затем при реализации ProvideFault
предоставить традиционный Http-ответ с кодом состояния 403 как сообщение о неисправности.
Пока у меня есть первое предположение, связанное с сервисом, но WCF, похоже, полностью игнорирует выходное сообщение, даже если вызывается обработчик ошибок.
На данный момент код выглядит так:
public class AuthWeb403ErrorHandler : IErrorHandler
{
#region IErrorHandler Members
public bool HandleError(Exception error)
{
return error is AuthenticationException;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
//first attempt - just a stab in the dark, really
HttpResponseMessageProperty property = new HttpResponseMessageProperty();
property.SuppressEntityBody = true;
property.StatusCode = System.Net.HttpStatusCode.Forbidden;
property.StatusDescription = "Forbidden";
var m = Message.CreateMessage(version, null);
m.Properties[HttpResponseMessageProperty.Name] = property;
fault = m;
}
#endregion
}
Имея это, я просто получаю стандартный WCF html 'Сервер обнаружил ошибку при обработке запроса. Смотрите журналы сервера для более подробной информации. ' - что бы произошло, если бы не было IErrorHandler. Это функция поведения, добавленная WebServiceHost? Или это потому, что сообщение, которое я создаю, просто неверно !? Я могу убедиться, что журнал событий действительно ничего не получает.
Моя текущая среда тестирования - это метод WebGet (как XML, так и Json), размещенный в службе, которая создается с отключенной совместимостью Asp.Net с WebServiceHostFactory. Сервисный метод просто выбрасывает исключение, о котором идет речь.