C# WCF服务合同接口的不同形式
似乎我可以在同一WCF合同接口API的以下三个不同版本之间自由切换,而不会中断客户端:C# WCF服务合同接口的不同形式,c#,.net,wcf,asynchronous,async-await,C#,.net,Wcf,Asynchronous,Async Await,似乎我可以在同一WCF合同接口API的以下三个不同版本之间自由切换,而不会中断客户端: [ServiceContract] interface IService { // Either synchronous // [OperationContract] // int SomeMethod(int arg); // Or TAP [OperationContract] Task<int> SomeMethodAsync(int arg
[ServiceContract]
interface IService
{
// Either synchronous
// [OperationContract]
// int SomeMethod(int arg);
// Or TAP
[OperationContract]
Task<int> SomeMethodAsync(int arg);
// Or APM
// [OperationContract(AsyncPattern = true)]
// IAsyncResult BeginSomeMethod(int arg, AsyncCallback callback, object state);
// int EndSomeMethod(IAsyncResult ar);
}
[服务合同]
接口设备
{
//同步的
//[经营合同]
//int-somethod(int-arg);
//或轻敲
[经营合同]
任务SomeMethodAsync(int arg);
//或APM
//[操作契约(AsyncPattern=true)]
//IAsyncResult BeginsMemethod(int-arg,异步回调,对象状态);
//内端体法(IAsyncResult ar);
}
现有的测试客户端应用程序在没有任何重新编译或触摸的情况下继续工作。如果我重新编译服务并将其引用重新导入到客户端应用程序中,WSDL定义保持不变,1:1
我的问题是:
- 这是我可以信赖的合法行为吗?它在任何地方都有记录吗
SomeMethod
-风格的方法转换为TAPSomeMethodAsync
-风格的方法,以便在实现中使用async/await
,从而提高WCF服务的可伸缩性,而不中断现有客户端
此外,在.NET3.5和.NET4.0下,WCF服务的扩展也存在一些已知的问题。它们记录在MSKB文章和CodeProject文章中。基本上,仅仅实现自然异步的服务契约API是不够的,WCF运行时仍然阻塞了请求线程
- 是否有人知道此问题是否已为.NET 4.5.x解决,即开即用?还是仍然需要额外的调整
合同描述中使用的操作描述
类,您将看到每个操作都有以下属性:同步方法
,开始方法
,结束方法
和任务方法
。创建描述时,WCF将根据操作的名称将所有方法合并到单个操作中。如果在不同模式(例如不同参数)中使用相同名称的操作之间存在一些不匹配,WCF将抛出一个异常,详细说明错误所在。WCF自动为基于任务的方法使用(可选)“异步”后缀,为APM使用开始/结束前缀
从这个意义上讲,客户端和服务器端是完全不相关的。从WSDL(svcuti
)生成代理类的实用程序可以为任何执行模式构建代理。它甚至不必是WCF服务
在服务器端,如果实现了多个模式,WCF将按照以下优先顺序仅使用一个模式:Task、Sync和APM。这是在MSDN的某个地方记录的,我现在找不到它。但您可以查看参考源
总之,只要不修改操作所代表的消息,就可以安全地更改服务器实现
关于比例(IMO应该是另一个问题)
- WCF的限制默认值已在.NET 4.5中更新为更合理的值,并且现在依赖于处理器(请参阅)李>
- 线程池问题没有变化。问题源于完成端口线程池的初始大小,它最初设置为逻辑处理器数量的4倍。您可以使用
ThreadPool.SetMinThreads
将数量增加一部分(请参阅)。此设置在客户端也可能是有益的
如果您在服务器端使用async(在调用其他服务、数据库等时),线程情况可能会显著改善,因为您不会浪费正在等待IO完成的线程池线程
在这些情况下,最好的办法是进行大量的基准测试。ASP.NET Web API 2也可以这样做。您可以使用intsomemethod(intarg)
或async Task SomeMethodAsync(intarg)
,两者对用户来说都是相同的。两者都是同步的客户端。@TimothyShields,对,另外Web API没有元数据概念来生成客户端代理AFAIK。要回答您的最后一个问题,一些调整已经被引入到4.5.0中,请参阅MSDN文章“链接和相关”中标题为“新传输默认值”的部分。一个很好的答案,tks。我只想问一个问题:“实际上,在一个合同界面中可以有所有3种模式,它们都与同一条消息相关”。显然,如果我取消对所有三个版本的注释,并在每个版本上保留[OperationContract]
,会不会混淆WCF运行时?我知道元数据只有一个消息API,但我必须在我的服务类中实现所有三个变量。哪一个将被映射来处理实际的消息?在客户端,您可以使用任何实现的模式。即使是svcutil
通常也会生成同步和异步方法。在服务器端,您必须实现整个接口,但WCF将按照我提到的优先顺序(先执行任务,然后同步,再执行APM),每个操作只使用一个方法。你可以