在为WCF实现接口时,不能使用可选参数

时间:2013-06-11 11:37:31

标签: c# wcf interface optional-parameters

在我的界面中,我宣布了这一点。

[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");

5 个答案:

答案 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建议的那样,重载函数。