Я знаю, что этот вопрос задавался несколько раз (поверьте мне, я знаю, что прошел почти все посты). Тем не менее, я до сих пор не могу заставить его работать ...
У меня есть следующие простые услуги:
[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
}
Если я передаю действительный идентификатор, я получаю подходящий Data
объект, попадающий по проводам, однако, если я передаю неверный идентификатор (чтобы вызвать исключение 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
к сгенерированному клиенту, так как он, кажется, не прийти автоматически.