如何在ASP.NET中同步调用DiscoveryClient.Find

时间:2013-05-24 10:37:43

标签: c# asp.net wcf service-discovery

我正在尝试从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?

2 个答案:

答案 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的答案。