ASP.NET MVC异步调用WCF服务

时间:2010-03-18 12:54:19

标签: asp.net-mvc wcf asynchronous callback

完成对WCF服务的异步调用后,我希望将成功消息设置为session并向用户显示通知。

我尝试使用两种方法来完成此操作。

1)基于事件的模型。

client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(GetDataCompleted);
client.GetDataAsync(id, client);
private void GetDataCompleted(object obj, GetDataCompletedEventArgs e) 
{
   this.SetNotification(new Notification() { Message = e.Result, Type =    NotificationType.Success });
}

在MyOperationCompleted事件中,我可以设置HttpContext.Current.Session的通知,但我必须等待此操作完成,并且无法导航到其他页面。

2)IAsyncResult模型。 通过这种方式我可以导航到其他页面并对wcf服务进行异步调用,但是在GetDataCallback方法中无法设置通知,因为session = null。

client.BeginGetData(id, GetDataCallback, client);
private void GetDataCallback(IAsyncResult ar)
{
    string name = ((ServiceReference1.Service1Client)ar.AsyncState).EndGetData(ar);
    this.SetNotification(new Notification() { Message = name, Type = NotificationType.Success });
}

在启用服务引用时“生成异步操作”。

请帮助我解决这个问题。感谢。

1 个答案:

答案 0 :(得分:0)

我不是wcf专家,但我发现工作的是将您的调用包装在ThreadPool.QueueUserWorkItem中的方法的Async版本中。没有这个,我有同样的阻塞问题。所以这似乎释放了你的asp mvc中的主线程继续前进,而另一个工作线程等待回调。

另外,我使用了AsyncController,虽然没有工作线程就没有这个。

请参阅:http://msdn.microsoft.com/en-us/library/ee728598.aspx

我用它作为指南,但仍然需要ThreadPool。

干杯