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中的可选查询字符串参数?的主要内容,如果未能解决你的问题,请参考以下文章