我知道这个问题已经被问过很多次了(相信我,我知道我几乎看过每一个帖子)。然而,我仍然不能让它工作…
我有以下简单的服务:
[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获取数据。