1

我在 IIS7.5 和 WCF 回调技术上使用 ASP.NET 4.0。我对回调没有问题。wcf 服务可以在 Web 客户端中触发回调方法,但它似乎在另一个带有 UI 线程的线程上。

public partial class _Default : System.Web.UI.Page, IServiceCallback
{
    private IService proxy = null;
    private static TextBox _textBoxtest;

    protected void Page_Load(object sender, EventArgs e)
    {
        _textBoxtest = TextBox1;
    }      

    protected void Button1_Click(object sender, EventArgs e)
    {
        //then server will call back to FireCallBackFromServer
        proxy.CallService(type, "someObject");
    }

    #region IServiceCallback Members

    public void FireCallBackFromServer(string txt)
    {
        TextBox1.Text = txt; <-- the value does not update on textBox
    }

    #endregion
}

请帮助我考虑如何从回调事件中更新我的文本框。

谢谢你。

4

2 回答 2

2

这就是 WCF 回调的工作方式。每个回调调用都由其自己的线程提供服务。我认为发生这种情况的原因是因为您没有SynchronizationContext将传入请求指向当前线程(并希望您的页面的当前实例)。相反的例子是 WPF 或 WinForm 应用程序中使用的回调。默认情况下,这些应用程序中的 UI 线程具有SynchronizationContext,因此如果您在 UI 线程中打开服务代理,回调请求将被路由回 UI 线程 - 它有时会导致另一个问题,因此您可以关闭SynchronizationContextin 的使用ServiceBehaviorAttribute

但是即使你解决了这个问题,你也会在 ASP.NET 中处理同样的问题。对 ASP.NET 的每个请求都会创建新的处理程序实例。因此,来自浏览器的每个请求都会创建新的页面实例。

我相信如果客户端是 ASP.NET,那么 WCF 回调没有意义,因为我仍然没有看到任何有效的实现。

于 2011-03-05T21:08:41.987 回答
0

我在使用 WCF 回调的 WPF 应用程序中遇到了这个问题,只有 UI 线程可以执行 UI 更新。我在 ASP.NET 中没有做太多工作,所以我不能 100% 确定答案是否相同,但问题看起来非常相似。

我解决问题的方法是使用 Dispatcher 和 lambdas 将更改发送到 UI 线程。放入代码的上下文中,它看起来像

public void FireCallBackFromServer(string txt)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => TextBox1.Text = txt;));
}

这应该将您的文本框的内容更新为回调中提供的文本。试一试,看看你的表现如何。

于 2011-03-05T21:22:09.227 回答