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


person Shafique    schedule 03.06.2010    source источник


Ответы (5)


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


Похоже, что это не поддерживается.

Тем не менее, корпорация Майкрософт была осведомлена об этой проблеме, и есть решение:

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

https://connect.microsoft.com/VisualStudio/feedback/details/451296/ < / а>

person luksan    schedule 05.06.2010
comment
Так что, похоже, это хорошо работает. Однако, если я попытаюсь запустить модульный тест против этого, он больше не будет работать, поскольку модульный тест не имеет WebOperationContext. Я просмотрел несколько примеров, но есть ли у кого-нибудь простой пример того, как имитировать WebOperationContext? - person Shafique; 08.06.2010
comment
Попробуйте Googling mock WebOperationContext. Есть много разных идей, как это сделать. - person luksan; 08.06.2010

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

person Olly    schedule 11.07.2012

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

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

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

person MonkeyWrench    schedule 30.09.2010

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

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

  //... rest of the code
}
person João Serra    schedule 30.04.2013

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

Чтобы отправить необязательные параметры запроса, я создал пакет 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;
person Cosmin Vană    schedule 13.11.2018