WCF IParameterInspector возвращать объект ответа - PullRequest
1 голос
/ 17 февраля 2011

У меня есть служба WCF, которая выполняет проверку входных параметров с помощью ловушки IParameterInspector до вызова фактического метода службы (на стороне поставщика WCF).Все работает хорошо, и я возвращаю ошибку проверки исключением FaultException.Мой вопрос: возможно ли вернуть объект с ошибками проверки вместо исключения?См. Следующий фрагмент:

public object BeforeCall(string operationName, object[] inputs)
    {
        var errors = new List<string>();

        // Validate each input parameter
        foreach (var entity in inputs)
        {
            // executing bunch of IValidator<T>'s
        }

        if (errors.Count != 0)
        {
            ////throw new FaultException<List<string>>(errors, "Input parameter validation error");
            return new Response<object>(null, errors);
        }
        else
        {
            return null;
        }
    }

Это, очевидно, не работает - Мой вопрос заключается в том, можно ли вернуть объект отклика потребителю со стороны BeforeCall (сторона поставщика WCF)?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2011

Это интересно, почему вы не добавляете контракт на отказ в свой веб-сервис и не позволяете ему выполнять проверку, ничего не перехватывая. Если что-то пойдет не так, это приведет к реальной ошибке по контракту. Это было бы нормально.

По вашей ошибке вы можете создать собственную ошибку с List<string> внутри, и ваши клиенты могут легко обработать ее для отображения ошибок.

0 голосов
/ 17 февраля 2011

Насколько я сейчас, вы не можете вернуть пользовательский объект. Потому что цель возвращаемого значения - позволить коррелировать методы BeforeCall с методами AfterCall. Значение, возвращаемое из BeforeCall, будет передано в соответствующий AfterCall. В частности, он находится в параметре correlationState.

Однако вы можете использовать FaultException<T>, где T - ваш пользовательский объект с ошибками проверки.

Вам необходимо определить свой пользовательский класс следующим образом:

public class DemoFault
{
[DataMember()]
public string ErrorText;
public DemoFault(string errorMessage)
{
ErrorText = errorMessage;
}
}

try
{
//blah blah blah
}
catch (FaultException<DemoFault> helloFault)
{
Console.WriteLine(hellofault.Detail.ErrorText);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...