Служба REST WCF: Как сделать параметры запроса обязательными и вернуть HTTP 400 для неправильных значений? - PullRequest
3 голосов
/ 22 января 2012

1.Обязательный параметр

В следующем примере определения URI

[WebGet(UriTemplate = "GetData?value={value}")]
[OperationContract]
string GetData(int value);
{
    return string.Format("You entered: {0}, value);
}

параметр «значение» является необязательным по умолчанию, и если я его не передаю (вызов http://baseAddress/GetData),переменная заполняется нулями.

Есть ли простой способ сделать этот параметр обязательным, может быть, атрибутом?Единственный способ, который я нашел, - это вручную проверить WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["value"] != null.

2.HTTP 400 в неправильном формате

Еще я ненавижу то, что HTTP 500 возвращается для /GetData?value=emptyOrAnythingThatIsNotAnInteger.Могу ли я вернуть HTTP 400 вместо этого?Конечно, без изменения типа на строку и проверки всего вручную.

Ответы [ 2 ]

1 голос
/ 23 января 2012

Причиной ошибки 500 при передаче чего-либо, отличного от целого числа, является то, что WCF пытается проанализировать значение, переданное в целое число, и на этом этапе ваш запрос уже получен и запущен для обработки службой.

Вы получаете ошибку 400 только тогда, когда сообщение находится на канале, и WCF не понимает формат сообщения входящего сообщения и что его необходимо преобразовать, как указано службой.

Чтобы проверить ваше значение и вернуть ошибку 400, попробуйте использовать «MessageInspectors», где у вас есть такие методы, как «AfterReceiveRequest» от IDispatcherMessageInspector. Некоторую информацию об инспекторах сообщений можно найти здесь .

1 голос
/ 22 января 2012

вы можете использовать строку вместо int, а затем выполнить свою собственную проверку и приведение типа (строка будет нулевой, если не будет передана). Тогда вы можете вернуть 400, если параметры неверны

...