我正在尝试从ASP.NET页面使用DiscoveryClient发现服务
void Page_Load(...) {
...
var result = DiscoveryClient.Find(anyCriteria);
....
}
调用失败,但有异常:
System.InvalidOperationException:此上下文中不允许异步操作
堆栈跟踪:
at System.Web.AspNetSynchronizationContext.OperationStarted() 在System.ServiceModel.Discovery.DiscoveryClient.InitializeAsyncOperation(AsyncOperationContext context) 在System.ServiceModel.Discovery.DiscoveryClient.FindAsyncOperation(FindCriteria criteria,Object userState) 在System.ServiceModel.Discovery.DiscoveryClient.FindAsync(FindCriteria criteria,Object userState) 在System.ServiceModel.Discovery.DiscoveryClient.Find(FindCriteria criteria)
我尝试使用<%Page ... Async="true" %>
而没有任何更改。
如何在ASP.NET页面中正确调用DiscoveryClient.Find?
答案 0 :(得分:2)
您是否设置了(web.config)
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
请参阅http://msdn.microsoft.com/en-us/library/hh975440.aspx
“对于支持WebSockets的应用程序,在Web窗体页面中使用基于任务的异步以及某些其他异步行为,必须设置此兼容性开关。”
我很确定最新的发现客户端使用TPL。
答案 1 :(得分:1)
AllowAsyncDuringSyncStages选项必须设置为“true”。
<appSettings>
<add key="aspnet:AllowAsyncDuringSyncStages" value="true" />
</appSettings>
这仅适用于AspNetSynchronizationContext,它由UseTaskFriendlySynchronizationContext设置强制执行。有关详细信息,请参阅Kenneth的答案。