C# 使用WCF回调更新asp.net gridview数据
我在asp.net web应用程序中使用wsdualhttpbinding实现了一个WCF回调,我想用它来更新页面上gridview中的行。我将gridview放在一个更新面板中,客户机上正在进行回调,但网格中的数据永远不会更新。在调用databind之后,我尝试调用update面板的update()方法,但没有成功。我有没有遗漏什么,或者我需要做些什么才能让它发挥作用 以下是我正在使用的一些代码: 在页面加载中,我附加到WCF回调,继承回调的接口,在接口的实现中,我使用从回调接收的数据绑定到网格:C# 使用WCF回调更新asp.net gridview数据,c#,asp.net,wcf,callback,C#,Asp.net,Wcf,Callback,我在asp.net web应用程序中使用wsdualhttpbinding实现了一个WCF回调,我想用它来更新页面上gridview中的行。我将gridview放在一个更新面板中,客户机上正在进行回调,但网格中的数据永远不会更新。在调用databind之后,我尝试调用update面板的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
}
[ServiceContract(CallbackContract=typeof(IAgentMessagingCallback))]
公共接口IAgentMessaging
{
[运营合同(IsOneWay=true)]
void SendActiveJobs(列出activeJobs);
[运营合同(IsOneWay=false)]
bool Subscribe();
[运营合同(IsOneWay=false)]
bool退订();
}
公共接口IAgentMessagingCallback
{
[运营合同(IsOneWay=true)]
作废活动作业(列出活动作业);
}
公共类代理消息:IAgentMessaging
{
私有静态只读列表_订阅者=新列表();
#区域IAgentMessaging成员
public void SendActiveJobs(列出activeJobs)
{
_subscribers.ForEach(委托(IAgentMessagingCallback)
{
if(((ICommunicationObject)回调).State==CommunicationState.Opened)
{
尝试
{
ActiveJobs(ActiveJobs);
}
捕获(例外情况除外)
{
messageing.ErrorMessage(例如,this.ToString());
}
}
其他的
{
_删除(回调);
}
});
}
公共bool Subscribe()
{
尝试
{
IAgentMessagingCallback callback=OperationContext.Current.GetCallbackChannel();
如果(!\u订阅服务器包含(回调))
{
_添加(回调);
返回true;
}
其他的
{
返回false;
}
}
捕获(例外情况除外)
{
messageing.ErrorMessage(例如,this.ToString());
返回false;
}
}
公共bool退订()
{
尝试
{
IAgentMessagingCallback callback=OperationContext.Current.GetCallbackChannel();
if(_subscribers.Contains(回调))
{
_删除(回调);
返回true;
}
其他的
{
返回false;
}
}
捕获(例外情况除外)
{
messageing.ErrorMessage(例如,this.ToString());
返回false;
}
}
#端区
}
回调是在您从Subscribe
操作返回之前发生的,还是在页面加载之后发生的?如果它发生在页面加载之后,我关心的是当回调发生时页面是否仍然存在
您是否意识到每个请求都会创建一个新的页面实例?一旦HTML被发送到客户端,实例就会被丢弃?一旦HTML被发送到客户端,服务器就无法对其进行任何更改。您必须显示一些代码。特别是,显示如何调用服务,并显示回调。在原始post中添加了代码。回调发生在页面加载之后。编写代码是为了在回调发生时不存在的任何实例都将从订户列表中删除,并且不再发送到。从我所阅读的内容来看,是否无法执行我试图执行的操作?通过使用调试器,我可以看出WCF回调能够接触页面并尝试在GridView上绑定,但在编写时,我假设,即使使用UpdatePanel,我也无法使用新数据更新网格。对吗?对。另外,当我说实例时,我指的是页面实例,而不是WCF实例。发送HTML后,页面立即被销毁。你必须反过来做UpdatePanel的事情。我以前从未这样做过,所以我不能建议您,但请查看updatepanel中的网格绑定到查询中返回的某些数据的示例。您甚至可以找到一个使用ObjectDataSource和WCF服务执行相同操作的示例。