Незадължителни параметри на низ на заявка в 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 и оставете частта „&records=10“ от URL адреса. Но сега получавам грешка в услугата, тъй като URI не съвпада с очаквания URI шаблон.

И така, как да внедря настройките по подразбиране за някои от параметрите на низа на моята заявка? Искам да задам по подразбиране "записите" на 10 например, ако тази част е оставена извън низа на заявката.


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


Отговори (5)


Забележка: Този въпрос е остарял, моля, вижте другите отговори.


Това не изглежда да се поддържа.

Microsoft обаче е уведомена за този проблем и има заобиколно решение:

Можете да получите желания ефект, като пропуснете низа на заявката от 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
Опитайте да потърсите в Google 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

Въпреки че това е стар въпрос, все още стигаме до този сценарий от време на време в последните проекти.

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