【问题标题】:Custom WebFaultException on WCF Rest Serialization Failure?WCF Rest序列化失败的自定义WebFaultException?
【发布时间】:2010-08-24 17:57:48
【问题描述】:

使用这样的对象:

[DataContract]
public class SampleItem
{              
    private int _id;

    [DataMember(IsRequired = true)]
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _stringValue;

    [DataMember()]
    public string StringValue
    {
        get { return _stringValue; }
        set { _stringValue = value; }
    }

还有这样的 REST 调用:

[WebInvoke(UriTemplate = "", Method = "POST")]        
public SampleItem Create(SampleItem instance)
{
    if (instance == null)
        throw new WebFaultException<string>("The SampleItem returned wasn't correctly formatted.",
                                            HttpStatusCode.BadRequest);               

    return instance;
}        

如果我用无效的 SampleItem 调用它,请说出这样的不带 ID 的话:

<SampleItem xmlns="http://schemas.datacontract.org/2004/07/UserWebServices" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><StringValue>SingleItem</StringValue></SampleItem>

然后服务器给我一个 400(正确),没有有用的错误信息(我得到的是:服务器在处理请求时遇到错误。有关更多详细信息,请参阅服务器日志)。理想情况下,我希望它说需要 ID 之类的内容。

如何拦截产生这个错误的地方并抛出我自己的WebFaultException?

【问题讨论】:

    标签: c# wcf rest serialization


    【解决方案1】:

    检查来自REST Start Kit 的 WebProtocolException。然后,您可以像这样在异常中发回自定义错误消息:

    catch (Exception ex)
            {
                throw new WebProtocolException(HttpStatusCode.InternalServerError, "Unexpected Error.", new ServiceFault { ExceptionDetail = "Your custom error message here" }, null);
            }
    

    【讨论】:

    • 是的,这很好,但我不知道在哪里捕获反序列化异常,因为如果它被抛出,我永远不会到达 Create 的主体。
    • 这仅在您使用 REST Starter 工具包中的工厂托管服务时才有效,不是吗? WebServiceHost2Factory。所以我认为如果您需要使用标准 WebServiceHostFactory 托管您的服务(例如,如果您想使用 WCF 4 中的标准帮助功能),这将不起作用。 Rest Starter 工具包确实包含一项帮助功能,但不如 WCF 4 (IMO) 中的帮助功能。
    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多