Невозможно перехватить пользовательское исключение в клиенте WCF - PullRequest
1 голос
/ 20 июля 2011

Я знаю, что этот вопрос задавался несколько раз (поверьте мне, я знаю, что прошел почти все посты). Тем не менее, я до сих пор не могу заставить его работать ...

У меня есть следующие простые услуги:

[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 к сгенерированному клиенту, так как он, кажется, не прийти автоматически.

Ответы [ 3 ]

2 голосов
/ 20 июля 2011

Вы используете webHttpBinding?Если это так, то вы должны использовать WebFaultException<T>, как указано здесь .

0 голосов
/ 21 июля 2011

Я немного запутался здесь.Вы используете REST или SOAP сервис здесь?Вопрос помечен как REST, а атрибут WebGet предлагает REST.Но вопрос также помечен WCF-PROXY, и вы говорите о добавлении ссылки на подачу, которая в значительной степени является операцией SOAP и совсем не генерирует клиента REST.С REST, если вы не используете службу OData, нет метаданных, которые вы можете использовать для добавления ссылки на службу.Вместо этого вы используете WebClient или HttpWebRequest или что-то подобное для получения данных с помощью созданного вами URL.

0 голосов
/ 20 июля 2011

Я не думаю из полученной вами ошибки, что вы когда-либо доходили до точки, где вы бросаете свой FaultException<CustomError>.Похоже, служба не знает, как обработать ваш запрос.

...