代码之家  ›  专栏  ›  技术社区  ›  puffpio

命名参数和可选参数,以及wcf

  •  20
  • puffpio  · 技术社区  · 15 年前

    所以.NET 4添加了一些非常好的命名参数和可选参数。我不需要做太多的单线过载方法。

    这对WCF有效吗?

    3 回复  |  直到 7 年前
        1
  •  20
  •   Preet Sangha    15 年前

    因为这些是编译器语义,所以我会说“不”,但是您希望它们只能以下面的方式工作。

    在服务代码方面,所有代码都接受默认参数。

    在客户机方面,我注意到VS2010上的“添加服务引用”工具没有采用默认值,而是将它们添加到生成的代理中。所以你必须生成你自己的代理。

    这样,如果在客户端合同实现中指定了缺省值,那么客户机代码就可以使用缺省值。

    我认为命名参数也是如此。

    总而言之,是的,但是这些东西不会带到WCF上。所发生的一切就是客户机代理必须作为一个适当的参数发送到通道工厂。

        2
  •  31
  •   John Saunders    15 年前

    WSDL无法描述可选参数,因此答案是“否”。

        3
  •  0
  •   SEn sen    7 年前

    我正在与Vs2017.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  %>