C# WCF Rest序列化失败时的自定义WebFaultException?

C# WCF Rest序列化失败时的自定义WebFaultException?,c#,wcf,rest,serialization,C#,Wcf,Rest,Serialization,对于这样的对象: [DataContract] public class SampleItem { private int _id; [DataMember(IsRequired = true)] public int Id { get { return _id; } set { _id = value; } } private string _stringValue; [D

对于这样的对象:

[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; }
    }
[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 xmlns="http://schemas.datacontract.org/2004/07/UserWebServices" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><StringValue>SingleItem</StringValue></SampleItem>
catch (Exception ex)
        {
            throw new WebProtocolException(HttpStatusCode.InternalServerError, "Unexpected Error.", new ServiceFault { ExceptionDetail = "Your custom error message here" }, null);
        }
还有这样的休息电话:

[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; }
    }
[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 xmlns="http://schemas.datacontract.org/2004/07/UserWebServices" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><StringValue>SingleItem</StringValue></SampleItem>
catch (Exception ex)
        {
            throw new WebProtocolException(HttpStatusCode.InternalServerError, "Unexpected Error.", new ServiceFault { ExceptionDetail = "Your custom error message here" }, null);
        }
[WebInvoke(UriTemplate=”“,Method=“POST”)]
公共SampleItem创建(SampleItem实例)
{
if(实例==null)
抛出新的WebFaultException(“返回的SampleItem格式不正确。”,
HttpStatusCode.BadRequest);
返回实例;
}        
如果我使用无效的SampleItem调用它,请说出一些没有ID的内容,如下所示:

[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; }
    }
[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 xmlns="http://schemas.datacontract.org/2004/07/UserWebServices" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><StringValue>SingleItem</StringValue></SampleItem>
catch (Exception ex)
        {
            throw new WebProtocolException(HttpStatusCode.InternalServerError, "Unexpected Error.", new ServiceFault { ExceptionDetail = "Your custom error message here" }, null);
        }
SingleItem
然后服务器返回400(正确),没有有用的错误信息(我得到的只是:服务器在处理请求时遇到错误。有关详细信息,请参阅服务器日志)。理想情况下,我希望它说像ID这样的东西是必需的


如何拦截生成此错误的位置并抛出我自己的WebFaultException?

从中查看WebProtocolException。然后,您可以在异常中发回自定义错误消息,如下所示:

[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; }
    }
[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 xmlns="http://schemas.datacontract.org/2004/07/UserWebServices" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><StringValue>SingleItem</StringValue></SampleItem>
catch (Exception ex)
        {
            throw new WebProtocolException(HttpStatusCode.InternalServerError, "Unexpected Error.", new ServiceFault { ExceptionDetail = "Your custom error message here" }, null);
        }

是的,这很好,但我不知道在哪里捕获反序列化异常,因为如果抛出反序列化异常,我永远不会将其到达Create主体。这只有在您使用REST初学者工具包中的工厂托管服务时才有效,不是吗?WebServiceHost2工厂。因此,我认为如果您需要使用标准的WebServiceHostFactory托管服务(例如,如果您想使用WCF 4中的标准帮助功能),那么这将不起作用。Rest初学者工具包确实包含一个帮助功能,但它没有WCF 4(IMO)中的功能好。