WCF休息错误处理

时间:2011-04-11 19:18:00

标签: wcf rest error-handling

我使用WCF 4.0 RESTful服务时遇到了令人头疼的问题。我正在尝试创建一个休息服务,如果出现错误,将返回描述问题的xml文档 例如:

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

为了使我能够使用visual studio提供的模板创建一个默认的REST服务 这是我的服务类:

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();
        }

    }
}

从上面的代码中可以看出,我在GetCollection方法中抛出WebFaultException。应该在响应的主体中放入一个“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没有被用户代码捕获:它暂停我的应用程序。如果按下继续,一切正常。 以下是一些描述我问题的图片:

fiddler的第一步: First Step

下一个Visual Studio的错误:Visual Studio Error

最后按下继续后一切正常:

对我来说没有任何意义,我不知道为什么会发生这种事情以及如何解决它:P。我在网上搜索了几天,试图找到一个没有运气的解决方案。我正在使用Visual Studio 2010 Ultimate

最诚挚的问候:)

1 个答案:

答案 0 :(得分:3)

这里没有错。您正在调试,抛出异常,它会中断,您继续并且它可以正常工作。

我怀疑你已经设置了异常处理选项(Ctrl + Alt + E)以在抛出异常时中断。 (选项中的“Thrown”)无论何时处理异常,这都会导致中断。

WCF操作中抛出的异常将由WCF运行时处理,如果它们是错误,它们将被发回,这样通道就不会出现故障。

现在关于发回XML,你可以使用WebFaultException<string>发送XML的字符串表示。