Причинение статуса ошибки HTTP, который будет возвращен в WCF - PullRequest
4 голосов
/ 15 марта 2011

Как я могу заставить свою службу WCF сообщать об ошибках в режиме RESTful?В частности, если вызывающая сторона передает недопустимые параметры строки запроса в мой метод, я хотел бы, чтобы пользователю возвращалась ошибка HTTP 400 или 404.Когда я ищу статус ошибки HTTP по отношению к WCF, все, что я могу найти, это страницы, на которых люди пытаются устранить ошибок, которые они получают.Я бы предпочел не просто выбросить FaultException, потому что это преобразуется в ошибку 500, которая не является правильным кодом состояния.

Ответы [ 3 ]

7 голосов
/ 15 марта 2011

Я нашел полезную статью здесь: http://zamd.net/2008/07/08/error-handling-with-webhttpbinding-for-ajaxjson/. Исходя из этого, вот что я придумал:

public class HttpErrorsAttribute : Attribute, IEndpointBehavior
{
    public void AddBindingParameters(
        ServiceEndpoint endpoint, 
        BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(
        ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
    }

    public void ApplyDispatchBehavior(
        ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        var handlers = endpointDispatcher.ChannelDispatcher.ErrorHandlers;
        handlers.Clear();
        handlers.Add(new HttpErrorHandler());
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }

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

        public void ProvideFault(
            Exception error, MessageVersion version, ref Message fault)
        {
            HttpStatusCode status;
            if (error is HttpException)
            {
                var httpError = error as HttpException;
                status = (HttpStatusCode)httpError.GetHttpCode();
            }
            else if (error is ArgumentException)
            {
                status = HttpStatusCode.BadRequest;
            }
            else
            {
                status = HttpStatusCode.InternalServerError;
            }

            // return custom error code.
            fault = Message.CreateMessage(version, "", error.Message);
            fault.Properties.Add(
                HttpResponseMessageProperty.Name,
                new HttpResponseMessageProperty
                {
                    StatusCode = status,
                    StatusDescription = error.Message
                }
            );
        }
    }
}

Это позволяет мне добавить атрибут [HttpErrors] к моему сервису. В моем собственном обработчике ошибок я могу убедиться, что коды состояния HTTP, которые я хочу отправить, отправлены.

3 голосов
/ 15 марта 2011

Если вы используете стандартный WCF, то FaultException - правильный подход к этому. Если вы не хотите этого делать и хотите быть RESTful, вам следует использовать REST WCF (). Вот шаблон быстрого запуска для 4.0 и 3.5 ). Это полностью поддерживает возврат кодов состояния HTTP клиенту.

0 голосов
/ 13 февраля 2013

Я хотел реализовать то же решение, о котором вы просили, приведенная ниже ссылка отлично работала, когда вы хотите поиграть с кодами состояния HTTP.

Как я могу вернуть пользовательский код состояния HTTP из WCF?Метод REST?

Существует WebOperationContext, к которому вы можете получить доступ, и у него есть свойство OutgoingResponse типа OutgoingWebResponseContext, которое имеет свойство StatusCode, которое можно установить.

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
...