2009-08-13 13 views
0

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 
} 
+0

Sie werden Code zeigen müssen. Zeigen Sie insbesondere, wie Sie den Dienst aufrufen, und zeigen Sie den Rückruf an. –

+0

Code zum ursprünglichen Beitrag hinzugefügt –

Antwort

1

ist der Rückruf geschehen, bevor Sie zurückgekommen th e Subscribe Operation oder nach Page_Load? Wenn es nach Page_Load passiert, mache ich mir Sorgen, ob die Seite immer noch da ist, wenn der Rückruf stattfindet.

Sie do feststellen, dass eine neue Seiteninstanz bei jeder Anfrage erstellt wird? Und dass die Instanz verworfen wird, sobald der HTML-Code an den Client gesendet wurde? Sobald der HTML-Code an den Client gesendet wurde, kann der Server nichts mehr ändern.

+0

Der Rückruf erfolgt nach dem Page_Load. Der Code wird so geschrieben, dass alle Instanzen, die beim Rückruf nicht vorhanden sind, aus der Liste der Abonnenten entfernt und nicht mehr gesendet werden. Von dem, was ich lese, ist es nicht möglich zu tun, was ich versuche zu tun? –

+0

Ich kann durch den Debugger sehen, dass der WCF Callback in der Lage ist, die Seite zu berühren und eine Bindung auf dem GridView zu versuchen, aber während Sie schreiben, nehme ich an, dass ich mit dem UpdatePanel das Raster nicht aktualisieren kann die neuen Daten. Ist das korrekt? –

+1

Das ist richtig. Wenn ich Instanz erwähnte, meinte ich auch die Seiteninstanz, nicht die WCF-Instanz. Die Seite wird direkt nach dem Senden des HTML-Codes zerstört. Sie müssen das UpdatePanel Ding andersherum machen. Ich habe es vorher noch nie gemacht, daher kann ich Sie nicht beraten, aber suchen Sie nach Beispielen, bei denen ein Gitter in einem Updatepanel an einige Daten bindet, die in einer Abfrage zurückgegeben werden. Sie können sogar ein Beispiel dafür finden, das Gleiche mit einer ObjectDataSource und einem WCF-Service zu tun. –

Verwandte Themen