1

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

我有以下简单的服务:

[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) 错误请求。

我最初走的是实现的道路,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);
    }
}

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

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

4

3 回答 3

2

你在用webHttpBinding吗?如果是这样,那么您应该按照此处WebFaultException<T>的说明使用。

于 2011-07-20T19:54:06.587 回答
0

我不认为从您收到的错误中您会到达抛出FaultException<CustomError>. 该服务似乎不知道如何处理您的请求。

于 2011-07-20T19:51:41.167 回答
0

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

于 2011-07-20T20:11:27.527 回答