且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

WCF服务将不会返回500内部服务器错误。相反,只有400错误的请求

更新时间:2023-08-31 20:00:46

试用抛出新WebFaultException(的HTTPStatus code.InternalServerError);

要指定一个错误的详细信息:

To specify an error details:

throw new WebFaultException<string>("Custom Error Message!", HttpStatusCode.InternalServerError);


高级:

如果你想更好地定义异常处理每个异常HTTP状态你需要创建一个自定义的ErrorHandler类,例如:


ADVANCED:

If you want better exception handling with defining HTTP status for each exception you'll need to create a custom ErrorHandler class for example:

class HttpErrorHandler : IErrorHandler
{
   public bool HandleError(Exception error)
   {
      return false;
   }

   public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
   {
      if (fault != null)
      {
         HttpResponseMessageProperty properties = new HttpResponseMessageProperty();
         properties.StatusCode = HttpStatusCode.InternalServerError;
         fault.Properties.Add(HttpResponseMessageProperty.Name, properties);
      }
   }
}

然后你需要创建一个服务行为,以连接到您的服务:

Then you need to create a service behaviour to attach to your service:

class ErrorBehaviorAttribute : Attribute, IServiceBehavior
{
   Type errorHandlerType;

   public ErrorBehaviorAttribute(Type errorHandlerType)
   {
      this.errorHandlerType = errorHandlerType;
   }

   public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
   {
   }

   public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
   {
   }

   public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
   {
      IErrorHandler errorHandler;

      errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
      foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
      {
         ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
         channelDispatcher.ErrorHandlers.Add(errorHandler);
      }
   }
}

附加到行为:

[ServiceContract]
public interface IService
{
   [OperationContract(Action = "*", ReplyAction = "*")]
   Message Action(Message m);
}

[ErrorBehavior(typeof(HttpErrorHandler))]
public class Service : IService
{
   public Message Action(Message m)
   {
      throw new FaultException("!");
   }
}