Optional query string parameters in URITemplate in WCF?

前端 未结 5 1742
盖世英雄少女心
盖世英雄少女心 2020-12-17 07:55

I\'m developing some RESTful services in WCF 4.0. I\'ve got a method as below:

[OperationContract]
    [WebGet(UriTemplate = \"Test?format=XML&records={r         


        
相关标签:
5条回答
  • 2020-12-17 08:01

    Note: This question is out of date, please see the other answers.


    This does not appear to be supported.

    However, Microsoft has been made aware of this issue and there is a work-around:

    You can get the desired effect by omitting the Query string from the UriTemplate on your WebGet or WebInvoke attribute, and using WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters from within your handlers to inspect, set defaults, etc. on the query parameters.

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

    0 讨论(0)
  • 2020-12-17 08:07

    This seems to work in WCF 4.0.
    Just make sure to set your default value in your "Service1.svc.cs"

    public string TestXml(string records)
    {
      if (records == null)
          records = "10";
    
      //... rest of the code
    }
    
    0 讨论(0)
  • 2020-12-17 08:10

    While this is an old question, we still come to this scenario from time to time in recent projects.

    To send optional query parameters, I created WCF Web Extensions nuget package.

    After installation, you can use the package like this:

    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();
        }
    }
    

    Server side you can retrieve the parameters using WebOperationContext:

    WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;
    
    0 讨论(0)
  • 2020-12-17 08:16

    According to this answer this is fixed in .NET 4.0. Failing to supply the query string parameter seems to result in its being given the default value for the type.

    0 讨论(0)
  • 2020-12-17 08:18

    Check this blog post out. Makes sense to me, and comes with a class to parse out the query string parameters.

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

    Basically don't define the query string parameters in the UriTemplate so it matches with/without the parameters, and use the sample class to retrieve them if they're there in the method implementation.

    0 讨论(0)
提交回复
热议问题