Ich habe einen WCF-Callback in einer asp.net-Webanwendung mit einem wsdualhttpbinding implementiert, das ich verwenden möchte, um die Zeilen in einer Gridview auf meiner Seite zu aktualisieren. Ich legte die Gridview in ein Update-Panel, und der Rückruf wird auf dem Client ausgelöst, aber die Daten im Grid werden nie aktualisiert. Ich habe versucht, die update() - Methode des Update-Panels nach dem Aufruf der Datenbank ohne Erfolg aufzurufen. Gibt es etwas, das mir fehlt oder etwas anderes, das ich tun muss, um dies zu erreichen? HierVerwenden von WCF-Callback zum Aktualisieren von asp.net-Gridview-Daten
ist ein Teil des Codes verwende ich:
auf der Seite Last lege ich auf den WCF-Rückruf, ich die Schnittstelle für den Rückruf erben, und in der Implementierung der Schnittstelle I an das Gitter binden mit den Daten, die von dem Rückruf empfangen wird:
[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
}
der Rückruf ist definiert als solche:
[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
}
Sie werden Code zeigen müssen. Zeigen Sie insbesondere, wie Sie den Dienst aufrufen, und zeigen Sie den Rückruf an. –
Code zum ursprünglichen Beitrag hinzugefügt –