我知道这个问题已经在很多场合被问过(相信我,我知道我几乎浏览过每一篇文章)。但是,我仍然无法让它工作......
我有以下简单的服务:
[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
属性添加到生成的客户端,因为它似乎不会自动出现。