Обработка ошибок отдыха WCF - PullRequest
2 голосов
/ 11 апреля 2011

У меня проблема с использованием сервиса RESTful WCF 4.0. Я пытаюсь создать службу отдыха, которая в случае ошибки вернет XML-документ с описанием проблемы. пример:

    <ErrorHandler>
        <cause>Resource not  available</cause>
        <errorCode>111103</errorCode>
    </ErrorHandler>

Для этого я создал REST-сервис по умолчанию, используя шаблон, предоставленный Visual Studio. Вот мой класс обслуживания:

public class Service1
    {
        // TODO: Implement the collection resource that will contain the SampleItem instances

        [WebGet(UriTemplate = "")]        
        public List<SampleItem> GetCollection()
        {
            // TODO: Replace the current implementation to return a collection of SampleItem instances\
           // throw new WebException("lala");
           throw new WebFaultException<ErrorHandler>(new ErrorHandler { cause = "Resource not  available", errorCode = 100 }, System.Net.HttpStatusCode.NotFound);
            //return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } };
        }

        [WebInvoke(UriTemplate = "", Method = "POST")]
        public SampleItem Create(SampleItem instance)
        {
            // TODO: Add the new instance of SampleItem to the collection           
            return new SampleItem() { Id = 3, StringValue = "59" };

        }

        [WebGet(UriTemplate = "{id}")]
        public SampleItem Get(string id)
        {
            // TODO: Return the instance of SampleItem with the given id
            throw new NotImplementedException();
        }

        [WebInvoke(UriTemplate = "{id}", Method = "PUT")]
        public SampleItem Update(string id, SampleItem instance)
        {
            // TODO: Update the given instance of SampleItem in the collection
            throw new NotImplementedException();
        }

        [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
        public void Delete(string id)
        {
            // TODO: Remove the instance of SampleItem with the given id from the collection
            throw new NotImplementedException();
        }

    }
}

Как видно из приведенного выше кода, я выкидываю исключение WebFaultException в методе GetCollection. это должно поместить в теле ответа объект «ErrorHandler». Вот как выглядит мой класс ErrorHandler:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization;

namespace WcfRestService1
{
    [DataContract]
    public class ErrorHandler
    {
        [DataMember]
        public int errorCode { get; set; }
        [DataMember]
        public string cause { get; set; }

    }
}

Сумасшедшая вещь в том, что она работает, но не работает :)). Я пытаюсь сказать, что Visual Studio выдает ошибку, говоря, что WebFaultException не перехватывается кодом пользователя: | и это приостанавливает мое приложение. Если я нажимаю продолжить, все работает как надо. Вот несколько фотографий, описывающих мою проблему:

Первый шаг в скрипаче: Первый шаг

Следующая ошибка Visual Studio: Ошибка Visual Studio

Наконец, после нажатия продолжить все работает:

Это не имеет смысла для меня, и я понятия не имею, почему это происходит и как это исправить: P. Я искал в интернете несколько дней, пытаясь найти решение без удачи. Я использую Visual Studio 2010 Ultimate

С наилучшими пожеланиями:)

1 Ответ

3 голосов
/ 11 апреля 2011

Здесь все в порядке.Вы выполняете отладку, выдается исключение, оно прерывается, вы продолжаете и работаете как следует.

Я подозреваю, что вы установили опцию обработки исключений (Ctrl + Alt + E) для прерывания при возникновении исключений.(«Брошено» в параметрах). Это приведет к разрыву всякий раз, когда генерируется исключение, независимо от того, обрабатывается ли оно.

Исключения, которые генерируются в операциях WCF, будут обрабатываться средой выполнения WCF, и если они являются ошибками, они будутотправлено обратно так, чтобы канал не был неисправен.

Теперь, что касается отправки XML, вы можете просто отправить строковое представление XML, используя WebFaultException<string>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...