所以 .Net 4 添加了非常漂亮的命名参数和可选参数。我不需要制作尽可能多的 1 行重载方法。
这对 WCF 有效吗?
所以 .Net 4 添加了非常漂亮的命名参数和可选参数。我不需要制作尽可能多的 1 行重载方法。
这对 WCF 有效吗?
WSDL 不能描述可选参数,所以答案是“否”。
由于这些是编译器语义,我会说不。但是,您希望它们仅以以下方式工作。
在服务代码方面,所有代码都将接受默认参数。
在客户端,我注意到 VS2010 上的“添加服务引用”工具不采用默认值并将它们添加到生成的代理中。所以你必须生成你自己的代理。
这样,如果在客户端合约实现中指定了默认值,则客户端代码可以使用默认值。
我认为命名参数也是如此。
总而言之,是的,但是这些东西并没有通过 WCF 进行。所发生的一切是客户端代理必须将其作为适当的参数发送到通道工厂。
我正在使用 VS 2017、.Net 4 和 WcfService 项目我有这样的服务:
界面:
namespace MyServiceNamespace
{
[ServiceContract]
public interface IMyService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
String GetSomething(int Produkt, DateTime MyDate, char SomeFlag);
}
public class myService : IMyService
{
public String GetSomething(int Produkt, DateTime MyDate, char SomeFlag)
{
if(Produkt==0){Produkt=12345;}
if(MyDate==DateTime.MinValue){MyDate=DateTime.Today;}
if(SomeFlag=='\0'){SomeFlag='F';}
return dosomething();
}
}
}
我可以用 http://myserver/myservice.svc/GetSomething?Produkt=1&MyDate=2018-01-01&SomeFlag=A 调用它
还有 http://myserver/myService.svc/GetSomething?Produkt=1&MyDate=2018-01-01
甚至 http://myserver/myservice.svc/GetSomething
缺少的参数用类型的“空”或默认值填充。我不知道是否有更好的方法来设置自己的默认值,因为
public String GetSomething(int Produkt, DateTime MyDate, char SomeFlag='F')
没用,还是 SomeFlag =='\0'
我没有发现的是我如何判断该值是否存在,因为参数丢失,或者被调用,即 1.1.0001
更新:标记 MyService.svc:
<%@ ServiceHost Language="C#" Debug="true" Service="MyServiceNameSpace.MyService" CodeBehind="MyService.svc.cs" Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory %>