Необязательные параметры строки запроса в 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. Невозможность предоставить параметр строки запроса, похоже, приводит к тому, что ему присваивается значение по умолчанию для типа.

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

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

По сути, не определяйте параметры строки запроса в 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;
Другие вопросы по тегам