在为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");

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

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