我知道这个问题已经在很多场合被问过了(相信我,我知道我几乎每一个帖子都经过过)。但是,我仍然无法让它工作......
我有以下简单的服务:
[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);
}
}
属性添加到生成的客户端,因为它不似乎自动过来了。
答案 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获取数据。