Необязательные параметры строки запроса в 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, например, если эта часть оставлена в строке запроса.
Ответы
Ответ 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 для их извлечения, если они присутствуют в реализации метода.
Ответ 4
Да, я могу подтвердить, после WCF 4.0 он работает как шарм, как описано здесь WCF и дополнительные параметры
Ответ 5
Это, похоже, работает в WCF 4.0.
Просто убедитесь, что вы установили свое значение по умолчанию в "Service1.svc.cs"
public string TestXml(string records)
{
if (records == null)
records = "10";
//... rest of the code
}