Подтвердить что ты не робот

Необязательные параметры строки запроса в URITemplate в WCF?

Я разрабатываю некоторые службы RESTful в WCF 4.0. У меня есть метод, как показано ниже:

[OperationContract]
    [WebGet(UriTemplate = "Test?format=XML&records={records}", ResponseFormat=WebMessageFormat.Xml)]
    public string TestXml(string records)
    {
        return "Hello XML";
    }

Итак, если я перемещаю свой браузер на http://localhost:8000/Service/Test?format=XML&records=10, тогда все работает как exepcted.

ОДНАКО, я хочу, чтобы иметь возможность перейти к http://localhost:8000/Service/Test?format=XML и оставить ссылку "& records = 10" URL-адреса, Но теперь я получаю служебную ошибку, поскольку URI не соответствует ожидаемому шаблону URI.

Итак, как мне реализовать значения по умолчанию для некоторых параметров строки запроса? Я хочу по умолчанию "записать" в 10, например, если эта часть оставлена ​​в строке запроса.

4b9b3361

Ответ 1

Примечание. Этот вопрос устарел, см. другие ответы.


Это не поддерживается.

Однако Microsoft была осведомлена об этой проблеме, и есть обход:

Вы можете получить желаемый эффект исключая строку запроса из UriTemplate на вашем WebGet или WebInvoke и использование WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters изнутри ваших обработчиков для проверки, установить значения по умолчанию и т.д. в запросе Параметры.

https://connect.microsoft.com/VisualStudio/feedback/details/451296/

Ответ 2

В соответствии с этим ответом это исправлено в .NET 4.0. Неспособность предоставить параметр строки запроса, похоже, приводит к тому, что ему присваивается значение по умолчанию для типа.

Ответ 3

Отметьте этот пост в блоге. Имеет смысл для меня и поставляется с классом для анализа параметров строки запроса.

http://blogs.msdn.com/b/rjacobs/archive/2009/02/10/ambiguous-uritemplates-query-parameters-and-integration-testing.aspx

В основном не задайте параметры строки запроса в UriTemplate, чтобы они соответствовали параметрам/без параметров и использовали класс sample для их извлечения, если они присутствуют в реализации метода.

Ответ 5

Это, похоже, работает в WCF 4.0.
Просто убедитесь, что вы установили свое значение по умолчанию в "Service1.svc.cs"

public string TestXml(string records)
{
  if (records == null)
      records = "10";

  //... rest of the code
}