Bar*_*ett 20 c# wcf asynchronous web-services asmx
我有一个Web应用程序,为JSON和ASMX Web服务提供WCF REST API.该应用程序已存在几年.它基于ASP.NET 2.0,但几年前升级到.NET 4.0,我刚刚升级到.NET 4.5以便能够使用新的异步框架.
应用程序的背后是一些遗留服务,我意识到通过异步提高性能有很大的潜力.我已经在应用程序中实现了异步,并且一切都通过WCF REST API完美地运行.
太晚了我发现ASMX API失败了,我想要这样的方法:
[WebMethod(Description = "Takes an internal trip ID as parameter.")]
async public Task<Trip> GetTrip(int tripid)
{
var t = await Trip.GetTrip(tripid);
return t;
}
Run Code Online (Sandbox Code Playgroud)
然后我了解到ASMX根本不支持async/await,并且每个人都建议迁移到WCF.我对此并不太满意.ASMX(实际上是其中三个)填充了不同的方法,并且我们希望从旧的API继续提供大量的API使用者.
但我们需要提高性能!有没有人知道一个解决方法,所以我可以继续在ASMX后面使用async/await,但是像以前一样公开ASMX?
Ste*_*ary 15
有可能这样做,但有点尴尬.ASMX支持APM样式的异步方法,您可以将TAP转换为APM(但请注意,该页面上的MSDN示例不会正确传播异常).
我在我的博客上有一个例子,它展示了如何在APM中包装TAP实现(异常传播保持正确的异常类型但丢失了堆栈;请参阅ExceptionDispatchInfo完全正确的异常传播).当WCF仅支持APM时,我使用了一段时间.一种非常类似的方法应该适用于ASMX.
但请注意,您必须以4.5(即httpRuntime.targetFramework)为目标,以便async/ await按预期工作.