【问题标题】:Optional query string parameters in URITemplate in WCF?WCF中URITemplate中的可选查询字符串参数?
【发布时间】:2011-02-27 11:52:02
【问题描述】:

我正在 WCF 4.0 中开发一些 RESTful 服务。我有一个方法如下:

[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,例如,如果该部分不在查询字符串中。

【问题讨论】:

    标签: wcf query-string uri uritemplate


    【解决方案1】:

    注意:此问题已过时,请查看其他答案。


    这似乎不受支持。

    但是,Microsoft 已意识到此问题并有一个解决方法:

    您可以通过以下方式获得所需的效果 省略查询字符串 WebGet 上的 UriTemplate 或 WebInvoke 属性,并使用 WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters 从您的处理程序内部进行检查, 在查询上设置默认值等 参数。

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

    【讨论】:

    • 所以这似乎运作良好。但是,如果我尝试对此运行单元测试,它不再起作用,因为单元测试没有 WebOperationContext。我查了几个例子,但是有没有人有一个如何模拟 WebOperationContext 的简单例子?
    • 尝试谷歌搜索“模拟 WebOperationContext”。关于如何做到这一点有很多不同的想法。
    【解决方案2】:

    根据this answer,这已在 .NET 4.0 中修复。未能提供查询字符串参数似乎会导致其被赋予该类型的默认值。

    【讨论】:

      【解决方案3】:

      查看这篇博文。对我来说很有意义,并带有一个类来解析查询字符串参数。

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

      基本上不在 UriTemplate 中定义查询字符串参数,因此它匹配有/无参数,并使用示例类检索它们(如果它们存在于方法实现中)。

      【讨论】:

        【解决方案4】:

        这似乎在 WCF 4.0 中有效。
        只需确保在“Service1.svc.cs”中设置默认值

        public string TestXml(string records)
        {
          if (records == null)
              records = "10";
        
          //... rest of the code
        }
        

        【讨论】:

          【解决方案5】:

          虽然这是一个老问题,但在最近的项目中,我们仍然不时遇到这种情况。

          为了发送可选的查询参数,我创建了WCF Web Extensionsnuget 包。

          安装后,你可以像这样使用这个包:

          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;
          

          【讨论】:

            猜你喜欢
            • 2013-06-19
            • 1970-01-01
            • 2010-11-14
            • 2023-02-09
            • 2011-06-25
            • 2012-08-28
            • 1970-01-01
            • 2012-08-05
            • 2020-01-06
            相关资源
            最近更新 更多