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

时间:2011-07-20 19:38:38

标签: wcf rest exception-handling wcf-proxy

我知道这个问题已经在很多场合被问过了(相信我,我知道我几乎每一个帖子都经过过)。但是,我仍然无法让它工作......

我有以下简单的服务:

[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),它总是作为{传递给客户端{1}}使用相同的消息:

远程服务器返回了意外响应:(400)错误请求。

我最初走的是实施ProtocolException的道路,这是我开始解决这个问题的地方,为了消除这个问题,我实施了这个基本服务...但我甚至无法得到它工作

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

IErrorHandler

我有什么遗失的吗? (我可以根据请求发布服务/客户端配置设置

注意:我注意到当您添加服务引用并生成客户端代理(我在VS2010上)时,您需要手动将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); } } 属性添加到生成的客户端,因为它不似乎自动过来了。

3 个答案:

答案 0 :(得分:2)

您使用的是webHttpBinding吗?如果是,那么您应该使用WebFaultException<T> here

答案 1 :(得分:0)

我从你收到的错误中认为你没有达到你抛出FaultException<CustomError>的程度。看起来该服务不知道如何处理您的请求。

答案 2 :(得分:0)

我在这里有点困惑。您在这里使用REST或SOAP服务吗?问题是标记REST,WebGet属性建议REST。但问题也标记为WCF-PROXY,你谈到添加一个服务引用,这是一个非常多的SOAP操作,根本不生成REST客户端。使用REST,除非您使用OData服务,否则您无法使用元数据来执行添加服务引用。相反,您使用WebClient或HttpWebRequest或类似的东西来使用您构造的URL获取数据。