14

在我的界面中,我已经声明了这一点。

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

5 回答 5

24

简单地说:不支持默认参数。

通过设计和合理的。我们使用 C# 编写 WCF 合同,但这是一个符号技巧。并非所有 C# 语言功能都可以在 SOAP、REST 或 JSON 中实现。

于 2013-06-11T14:02:50.547 回答
14

你可以试试这个,重载函数。

[OperationContract]
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);

然后另一种选择是使用 aDataContract而不是多个参数,并IsRequired在适当的 s 上设置为 false DataMember,就像在这个问题中解释的那样。

于 2013-06-11T11:45:39.760 回答
3

我让编译器抱怨和哭泣,因为没有带有单个参数签名的方法。

从头开始。您的编译器“抱怨”是因为服务无法识别具有默认值的可选参数,因此它只会公开需要所有参数的方法。基于此元数据,您生成一个客户端代理(“服务参考”),它也不包含您期望的方法;它只看到服务公开的方法:带有(String beep, String boop)签名的方法。所以这就是为什么最终,当您尝试调用类上不存在的方法时会收到编译错误。

现在,当您在服务上调用此方法时,您的客户端将必须提供这两个值。如果您提供null,服务将看到null,因为默认参数的值必须编译到调用者中。WCF 不支持这一点,因此您只需按照@StephenBorg 的建议创建重载。

于 2013-06-11T11:51:13.897 回答
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);
于 2014-07-11T07:04:44.763 回答
1

您应该检查添加服务引用时生成的代码。

因为代码是从 WISDL 生成的,其中签名是(伪):

GetStuff(String , String )

它相应地生成代码,而不知道可选参数。所以,如果你想变得懒惰,你应该改变生成的代理类,或者像@Stephen Borg 建议的那样,重载这个函数。

于 2013-06-11T11:50:38.790 回答