在为WCF实现接口时不能使用可选参数
本文关键字:参数 不能 WCF 实现 接口 在为 | 更新日期: 2023-09-27 18:17:55
在我的界面中我已经声明了这个
[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");
simple:不支持默认参数。
通过设计和合理。我们使用c#来编写WCF契约,但这是一个符号技巧。并不是每一个c#语言的特性都可以在SOAP、REST或JSon中实现。
你可以试试重载这个函数。
[OperationContract]
MyResponse GetData();
[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
另一种选择是使用一个DataContract
而不是多个参数,并在适当的DataMember
s上将IsRequired
设置为false,如本问题所述。
我得到了编译器的抱怨和哭泣,没有一个方法的签名只有一个参数。
从头开始。编译器"抱怨"是因为该服务不能识别带有默认值的可选参数,所以它只会公开需要所有参数的方法。基于这个元数据,你生成一个客户端代理("服务引用"),它也不包含你期望的方法;它只看到服务公开的方法:具有(String beep, String boop)
签名的方法。这就是为什么当你试图在一个类上调用一个不存在的方法时,你最终会收到一个编译错误。
现在,当您在服务上调用此方法时,您的客户端将必须提供这两个值。如果您提供null
,服务将看到null
,因为默认参数的值必须被编译到调用者中。WCF不支持,所以你只需要创建重载@StephenBorg建议。
你可以这样做:
[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);
您应该检查添加服务引用时生成的代码。
作为从WISDL生成的代码,其中签名是(伪):
GetStuff(String , String )
生成相应的代码,而不知道可选参数。所以,如果你想偷懒,你应该改变生成的代理类,或者像@Stephen Borg建议的那样,重载函数。