我正在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,例如,如果该部分不在查询字符串之外。
答案 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)
查看此博文。对我有意义,并附带一个类来解析查询字符串参数。
基本上不要在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;