45

我正在 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。

4

5 回答 5

53

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


这似乎不受支持。

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

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

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

于 2010-06-05T17:00:21.970 回答
17

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

于 2012-07-11T12:58:09.967 回答
4

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

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

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

于 2010-09-30T14:23:01.887 回答
2

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

public string TestXml(string records)
{
  if (records == null)
      records = "10";

  //... rest of the code
}
于 2013-04-30T10:08:52.547 回答
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;
于 2018-11-13T19:41:39.890 回答