【问题标题】:Using WCF Callback to update asp.net gridview data使用 WCF 回调更新 asp.net gridview 数据
【发布时间】:2009-08-13 14:36:23
【问题描述】:

我在 asp.net Web 应用程序中使用 wsdualhttpbinding 实现了 WCF 回调,我想用它来更新页面上 gridview 中的行。我将网格视图放在更新面板中,并且在客户端上触发回调,但网格中的数据永远不会更新。在调用数据绑定无济于事后,我尝试调用更新面板的 Update() 方法。有什么我遗漏的东西或我需要做的其他事情才能让它工作吗?

这是我正在使用的一些代码:

在页面加载中,我附加到 WCF 回调,我继承回调的接口,并在接口的实现中使用从回调接收到的数据绑定到网格:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
public partial class activeJobs : System.Web.UI.UserControl, IAgentMessagingCallback
{
    AgentMessagingClient _messagingClient;

    protected void Page_Load(object sender, EventArgs e)
    {
        InstanceContext context = new InstanceContext(this);
        _messagingClient = new AgentMessagingClient(context, "AgentMessaging_IAgentMessaging");

        if (_messagingClient.Subscribe())
        {
            Page.Title = string.Format("Timeout will occur at {0}", DateTime.Now.AddMinutes(10));
        }
    }

    #region IAgentMessagingCallback Members

    public void ActiveJobs(SubmittedJob[] activeJobs1)
    {
        activeJobsGrid.DataSource = activeJobs1.ToList();
        //checked in the debugger, the data is actually recieved...
        activeJobsGrid.DataBind();

        //the update method for the updatepanel...tried this both ways, no go
        //activeJobsGridUP.Update(); 
    }

    #endregion
}

回调定义如下:

[ServiceContract(CallbackContract = typeof(IAgentMessagingCallback))]
public interface IAgentMessaging
{
    [OperationContract(IsOneWay = true)]
    void SendActiveJobs(List<SubmittedJob> activeJobs);

    [OperationContract(IsOneWay = false)]
    bool Subscribe();

    [OperationContract(IsOneWay = false)]
    bool Unsubscribe();
}

public interface IAgentMessagingCallback
{
    [OperationContract(IsOneWay = true)]
    void ActiveJobs(List<SubmittedJob> activeJobs);
}

public class AgentMessaging : IAgentMessaging
{
    private static readonly List<IAgentMessagingCallback> _subscribers = new List<IAgentMessagingCallback>();

    #region IAgentMessaging Members

    public void SendActiveJobs(List<SubmittedJob> activeJobs)
    {
        _subscribers.ForEach(delegate(IAgentMessagingCallback callback)
        {
            if (((ICommunicationObject)callback).State == CommunicationState.Opened)
            {
                try
                {
                    callback.ActiveJobs(activeJobs);
                }
                catch (Exception ex)
                {
                    Messaging.ErrorMessage(ex, this.ToString());
                }
            }
            else
            {
                _subscribers.Remove(callback);
            }
        });
    }

    public bool Subscribe()
    {
        try
        {
            IAgentMessagingCallback callback = OperationContext.Current.GetCallbackChannel<IAgentMessagingCallback>();
            if (!_subscribers.Contains(callback))
            {
                _subscribers.Add(callback);
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception ex)
        {
            Messaging.ErrorMessage(ex, this.ToString());
            return false;
        }
    }

    public bool Unsubscribe()
    {
        try
        {
            IAgentMessagingCallback callback = OperationContext.Current.GetCallbackChannel<IAgentMessagingCallback>();
            if (_subscribers.Contains(callback))
            {
                _subscribers.Remove(callback);
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception ex)
        {
            Messaging.ErrorMessage(ex, this.ToString());
            return false;
        }
    }

    #endregion
}

【问题讨论】:

  • 你将不得不展示一些代码。特别是,显示您如何调用服务,并显示回调。
  • 在原帖中添加代码

标签: c# asp.net wcf callback


【解决方案1】:

回调是在您从Subscribe 操作返回之前发生还是在 Page_Load 之后发生?如果它发生在 Page_Load 之后,我担心当回调发生时页面是否仍然存在。

确实意识到每个请求都会创建一个新的页面实例吗?并且一旦将 HTML 发送到客户端,该实例就会被丢弃? HTML 发送到客户端后,服务器无法更改它。

【讨论】:

  • 回调发生在 Page_Load 之后。编写代码以便在回调发生时不存在的任何实例都将从订阅者列表中删除,并且不会再被发送到。从我正在阅读的内容来看,是否不可能做我想做的事情?
  • 我可以通过使用调试器看到 WCF 回调能够触摸页面并尝试在 GridView 上进行绑定,但是当您编写时,我假设即使使用 UpdatePanel,我也不会能够使用新数据更新网格。对吗?
  • 没错。另外,当我说实例时,我指的是页面实例,而不是 WCF 实例。该页面在 HTML 发送后立即被销毁。您必须反过来做 UpdatePanel 的事情。我以前从来没有这样做过,所以我不能给你建议,但是请寻找更新面板中的网格绑定到查询中返回的某些数据的示例。您甚至可以找到对 ObjectDataSource 和 WCF 服务执行相同操作的示例。
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多