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

Posted

技术标签:

【中文标题】命名参数和可选参数,以及 WCF【英文标题】:Named and optional parameters, and WCF 【发布时间】:2011-02-08 15:09:36 【问题描述】:

所以 .Net 4 添加了命名参数和可选参数,它们非常棒。我不需要制作尽可能多的 1 行重载方法。

这对 WCF 有效吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

不幸的是 [OperationContract] 只是默默地将可选参数转换为必需参数:( @epalm:它不会转换任何东西。它只是忽略不相关的事情。 澄清:当我托管 WCF 服务并通过 Metadata Exchange 生成代理时,生成的 Reference.cs 中的方法具有必需的参数,即使服务中的方法包含可选参数。 @epalm:这就是我在回答中给出的原因:WSDL 和 MEX 对可选参数一无所知,也不知道任何其他特定于平台的功能。例如,观看他们不支持async【参考方案2】:

由于这些是编译器语义,我会说不。但是,您希望它们仅以以下方式工作。

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

在客户端,我注意到 VS2010 上的“添加服务引用”工具不会采用默认值并将它们添加到生成的代理中。所以你必须生成你自己的代理。

这样,如果在客户端合约实现中指定了默认值,客户端代码就可以使用默认值。

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

总而言之,是的,但这些东西并没有通过 WCF 进行。所发生的只是客户端代理必须将其作为适当的参数发送到通道工厂。

【讨论】:

其根本原因是 WSDL 和 MEX 都不了解 C# 编程语言的特性。他们无法描述可选参数。【参考方案3】:

我正在使用 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  %>

【讨论】:

以上是关于命名参数和可选参数,以及 WCF的主要内容,如果未能解决你的问题,请参考以下文章

Dart语法之可选参数

ApiControllerAttribute 和可选参数

WinRT和可选参数发行

存储可选管道多行字符串和可选参数的批处理脚本

通用方法和可选参数

Python 用可变数量的位置参数和可选参数装饰方法