无法在WCF客户端中捕获自定义异常



我知道这个问题已经被问过很多次了(相信我,我知道我几乎看过每一个帖子)。然而,我仍然不能让它工作…

我有以下简单的服务:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "/data/{id}", ResponseFormat = WebMessageFormat.Json)]
    [FaultContract(typeof(CustomError))]
    Data GetData(string id);
}
[DataContract]
public partial class Data
{
    [DataMember]
    public string Property { get; set; }
}
[DataContract]
public class CustomError
{
    [DataMember]
    public string Message { get; set; }
}

GetData的实现中如下所示:

public Data GetData(string id)
{
    int dataId = -1;
    if (!Int32.TryParse(id, out dataId))
    {
        var detail = new CustomError() { Message = "DataID was not in the correct format."};
        throw new FaultException<CustomError>(detail);
    }
    ... return instance of Data
}

如果我传入一个有效的ID,我得到适当的Data对象穿过线,然而,如果我传入一个无效的ID(触发FaultException),它总是传递到客户端作为一个ProtocolException与相同的消息:

远程服务器返回了一个意外的响应:(400)Bad Request.

我最初沿着实现IErrorHandler的道路走下去,这就是我开始遇到问题的地方,所以为了从等式中消除它,我实现了这个基本服务…但是我甚至不能让它工作。

在我的客户端上,我已经创建了一个服务引用,并使用客户端代理,即

using (var client = new DataServiceClient())
{
    try
    {
        var user = client.GetData("twenty");
        Console.WriteLine(user.Property);
    }
    catch (System.ServiceModel.FaultException<CustomError> ex)
    {
        Console.WriteLine(ex.Message);
    }
}

我错过了什么吗?(我可以在请求时发布服务/客户端配置设置)

NB:我注意到,当您添加服务引用并生成客户端代理(我在VS2010上)时,您需要手动将WebGet/WebInvoke属性添加到生成的客户端,因为它似乎不会自动过来。

您是否使用webHttpBinding ?如果是这样,那么您应该使用这里提到的WebFaultException<T>

我不认为从你收到的错误,你曾经得到的点,你扔你的FaultException<CustomError>。服务似乎不知道如何处理您的请求

我在这里有点困惑。您在这里使用的是REST还是SOAP服务?这个问题被标记为REST,而WebGet属性建议使用REST。但是这个问题也被标记为WCF-PROXY,你谈到了添加一个服务引用,这在很大程度上是一个SOAP操作,根本不生成REST客户端。对于REST,除非您使用OData服务,否则没有元数据可以用于添加服务引用。相反,您可以使用WebClient或HttpWebRequest或类似的东西来使用您构建的URL获取数据。

最新更新