所以.Net 4添加了命名和可选参数,非常甜蜜。我不需要制作尽可能多的1行重载方法。
这会对WCF有用吗?
答案 0 :(得分:31)
WSDL无法描述可选参数,因此答案是“否”。
答案 1 :(得分:20)
由于这些是编译器语义,我会说不。但是你希望它们能够以下面的方式工作。
在服务代码方面,所有代码都接受默认参数。
在客户端,我注意到VS2010上的“添加服务引用”工具不采用默认值并将它们添加到生成的代理中。所以你必须生成你自己的代理。
通过这种方式,如果在客户端合同实现中指定了默认值,则客户端代码可以使用默认值。
我认为命名参数也是如此。
总而言之,是的,但这些东西不是通过WCF传播的。所有这一切都是客户端代理必须作为适当的参数发送到通道工厂。
答案 2 :(得分:0)
我正在使用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 %>