WCF中URITemplate中的可选查询字符串参数?

Posted

技术标签:

【中文标题】WCF中URITemplate中的可选查询字符串参数?【英文标题】:Optional query string parameters in URITemplate in WCF? 【发布时间】: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,例如,如果该部分不在查询字符串中。

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于WCF中URITemplate中的可选查询字符串参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用查询字符串的情况下使用 WCF 在 UriTemplate 中传递 JSON 字符串

RegEx - 正向后视中的可选子字符串

ASP.NET Web API 中的可选查询字符串参数

在 Postman 中使用路径参数测试 WCF API

WCF 的复杂 UriTemplate

WCF REST模式下的UriTemplate路径问题