Вы можете реализовать IErrorHandler
для перехвата SecurityException
. и затем введите WebFaultException
с кодом состояния.
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error is SecurityException)
{
var faultEx = new WebFaultException<string>("Forbidden", HttpStatusCode.Forbidden)
fault = Message.CreateMessage(version, faultEx.CreateMessageFault(), null);
}
}
Обратите внимание, что это не проверено - исключения безопасности имеют неприятную привычку теряться в рамках / конвейерах, но эта идея была немного длинной для комментария.
Обычно вы добавляете свой собственный IErrorHandler с поведением, которое может быть настроено в вашем коде DI или в конфигурации.
public class ErrorHandlerBehavior : IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
// not implemented
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (var dispatcherBase in serviceHostBase.ChannelDispatchers)
{
var dispatcher = dispatcherBase as ChannelDispatcher;
if (dispatcher != null)
dispatcher.ErrorHandlers.Add(new MyCustomErrorHandler());
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
// not implemented
}
}