命名参数和可选参数,以及 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的主要内容,如果未能解决你的问题,请参考以下文章