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

时间:2010-06-03 19:47:22

标签: wcf query-string uri uritemplate

我正在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,例如,如果该部分不在查询字符串之外。

6 个答案:

答案 0 :(得分:53)

注意:此问题已过期,请参阅其他答案。


这似乎不受支持。

然而,微软已经意识到这个问题并且有一个解决方法:

  

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

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

答案 1 :(得分:17)

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

答案 2 :(得分:4)

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

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

基本上不要在UriTemplate中定义查询字符串参数,以便它与/不匹配参数,如果它们在方法实现中存在,则使用样本类来检索它们。

答案 3 :(得分:4)

是的我可以在WCF 4.0之后确认它的效果就像这里描述的魅力WCF and optional parameters

答案 4 :(得分:2)

这似乎适用于WCF 4.0 只需确保在" Service1.svc.cs"

中设置默认值
public string TestXml(string records)
{
  if (records == null)
      records = "10";

  //... rest of the code
}

答案 5 :(得分:0)

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

要发送可选的查询参数,我创建了WCF Web Extensions 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;