Необязательные параметры строки запроса в 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, то все будет работать как ожидалось.
ОДНАКО, я хочу иметь возможность перейти к http://localhost:8000/Service/Test?format=XML и не указывать часть URL-адреса "& records = 10". Но теперь я получаю сервисную ошибку, поскольку URI не соответствует ожидаемому шаблону URI.
Итак, как мне реализовать значения по умолчанию для некоторых параметров строки запроса? Я хочу установить по умолчанию для "записей" 10, например, если эта часть не указана в строке запроса.
6 ответов
Примечание. Этот вопрос устарел, см. Другие ответы.
Это не поддерживается.
Тем не менее, Microsoft была осведомлена об этой проблеме, и есть обходной путь:
Вы можете получить желаемый эффект, пропустив строку запроса из UriTemplate в вашем атрибуте WebGet или WebInvoke и используя WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters для проверки, установки значений по умолчанию и т. Д. В параметрах запроса.
https://connect.microsoft.com/VisualStudio/feedback/details/451296/
Согласно этому ответу это исправлено в.NET 4.0. Невозможность предоставить параметр строки запроса, похоже, приводит к тому, что ему присваивается значение по умолчанию для типа.
Проверьте это сообщение в блоге. Имеет смысл для меня и поставляется с классом для анализа параметров строки запроса.
По сути, не определяйте параметры строки запроса в UriTemplate, чтобы она соответствовала параметрам или без них, и используйте образец класса, чтобы получить их, если они есть в реализации метода.
Да, я могу подтвердить, что после WCF 4.0 он работает как шарм, как описано здесь WCF и дополнительные параметры
Это похоже на работу в WCF 4.0.
Просто убедитесь, что вы установили значение по умолчанию в вашем "Service1.svc.cs"
public string TestXml(string records)
{
if (records == null)
records = "10";
//... rest of the code
}
Хотя это старый вопрос, мы все еще время от времени приходим к этому сценарию в последних проектах.
Чтобы отправить необязательные параметры запроса, я создал пакет nuget WCF Web Extensions.
После установки вы можете использовать пакет следующим образом:
using (var factory = new WebChannelFactory<IQueryParametersTestService>(new WebHttpBinding()))
{
factory.Endpoint.Address = new EndpointAddress(ServiceUri);
factory.Endpoint.EndpointBehaviors.Add(new QueryParametersServiceBehavior());
using (var client = factory.CreateWebChannel())
{
client.AddQueryParameter("format", "xml");
client.AddQueryParameter("version", "2");
var result = client.Channel.GetReport();
}
}
На стороне сервера вы можете получить параметры, используя WebOperationContext:
WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;