Необязательные параметры строки запроса в URITemplate в WCF? - PullRequest
45 голосов
/ 03 июня 2010

Я разрабатываю некоторые 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 и пропустить часть "& records = 10" URL. Но теперь я получаю сервисную ошибку, поскольку URI не соответствует ожидаемому шаблону URI.

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

Ответы [ 6 ]

53 голосов
/ 05 июня 2010

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


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

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

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

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

17 голосов
/ 11 июля 2012

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

4 голосов
/ 15 марта 2013

Да, я могу подтвердить, что после WCF 4.0 он работает как шарм, как описано здесь WCF и дополнительные параметры

4 голосов
/ 30 сентября 2010

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

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

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

2 голосов
/ 30 апреля 2013

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

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

  //... rest of the code
}
0 голосов
/ 13 ноября 2018

Хотя это старый вопрос, мы все еще время от времени приходим к этому сценарию в последних проектах.

Чтобы отправить необязательные параметры запроса, я создал Веб-расширения WCF пакет nuget.

После установки вы можете использовать такой пакет:

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;
...