在我的界面中,我宣布了这一点。
[OperationContract]
[WebGet]
String GetStuff(String beep, String boop = "too lazy to type");
我按如下方式实现了它。
String GetStuff(String beep, String boop = "too lazy to type") { ... }
它编译并上传为我的WCF服务。但是,当我将它用作Web引用并尝试执行下面的代码时,我得到了编译器抱怨和哭泣没有带有单个参数签名的方法。最后一行是问题。
我怎么能懒得默认输入 ?
ServiceClient client = new ServiceClient();
client.GetStuff("blobb", "not lazy");
client.GetStuff("blobb");
答案 0 :(得分:24)
简单:不支持默认参数。
通过设计和理性。我们使用C#来编写WCF合同,但这是一个符号技巧。并非每个C#语言功能都可以在SOAP,REST或JSon中实现。
答案 1 :(得分:14)
你可以尝试这个,重载功能。
[OperationContract]
MyResponse GetData();
[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
然后另一种选择是使用DataContract
而不是多个参数,并在适当的IsRequired
上将DataMember
设置为false,如this question中所述。
答案 2 :(得分:3)
我让编译器抱怨和哭泣没有带有单个参数签名的方法。
从头开始。您的编译器“抱怨”是因为服务无法识别具有默认值的可选参数,因此它将公开需要所有参数的方法。基于此元数据,您将生成客户端代理(“服务引用”),该代理也不包含您期望的方法;它只能看到服务公开的方法:具有(String beep, String boop)
签名的方法。因此,当您尝试在类上调用不存在的方法时,最终会收到编译错误。
现在,当您在服务上调用此方法时,您的客户端必须提供这两个值。如果您提供null
,则服务将显示null
,因为必须将默认参数的值编译到调用方中。 WCF不支持,所以你只需要像@StephenBorg建议的那样创建重载。
答案 3 :(得分:3)
你可以这样做:
[DataContract]
public class GetStuffParams
{
[DataMember]
string beep {get; set; }
[DataMember]
string boop {get; set;}
public GetStuffParams() { boop = "too lazy to type"; }
}
[OperationContract]
[WebGet]
String GetStuff(GetStuffParams stuffParams);
答案 4 :(得分:1)
您应该查看添加服务引用时生成的代码。
因为代码是从WISDL生成的,签名是(伪):
GetStuff(String , String )
它会相应地生成代码,而不知道可选参数。所以,如果你想变懒,你应该改变生成的代理类,或者像@Stephen Borg建议的那样,重载函数。