2009-08-13 5 views
0

J'ai un callback WCF implémenté dans une application web asp.net en utilisant un wsdualhttpbinding que je voudrais utiliser pour mettre à jour les lignes dans un gridview sur ma page. Je mets le gridview dans un panneau de mise à jour, et le rappel est en train d'exploser sur le client, mais les données dans la grille ne sont jamais mises à jour. J'ai essayé d'appeler la méthode Update() du panneau de mise à jour après avoir appelé le databind en vain. Y at-il quelque chose qui me manque ou quelque chose d'autre que je dois faire pour que cela fonctionne?Utilisation du rappel WCF pour mettre à jour les données gridview d'asp.net

Voici une partie du code J'utilise:

la charge de la page, je joins le rappel WCF, je possèdes l'interface pour le rappel et la mise en œuvre de l'interface I se lient au réseau avec les données reçues du callback:

[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 
} 

le rappel est défini comme tel:

[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

Vous allez devoir montrer du code. En particulier, montrez comment vous appelez le service et affichez le rappel. –

+0

Code ajouté au message d'origine –

Répondre

1

est-ce que cela se produise avant le rappel que vous avez retourné de e e Subscribe ou après Page_Load? Si cela se produit après Page_Load, je m'inquiète de savoir si la page sera toujours là quand le rappel se produira.

est-ce que vous constatez qu'une nouvelle instance de page est créée à chaque requête? Et que l'instance est supprimée une fois que le code HTML a été envoyé au client? Une fois que le code HTML a été envoyé au client, il n'y a rien que le serveur puisse faire pour le changer.

+0

Le rappel se produit après le Page_Load. Le code est écrit de sorte que toutes les instances qui ne sont pas là quand le rappel se produit, elles seront supprimées de la liste des abonnés, et ne seront plus envoyées. D'après ce que je lis, n'est-il pas possible de faire ce que j'essaie de faire? –

+0

Je peux voir en utilisant le débogueur que le rappel WCF est capable de toucher la page et de tenter une liaison sur GridView, mais comme vous écrivez, je suppose, même avec le UpdatePanel, je ne serai pas capable de mettre à jour la grille avec les nouvelles données. Est-ce exact? –

+1

C'est correct. Aussi, quand j'ai dit instance, je voulais dire l'instance de la page, pas l'instance WCF. La page est détruite juste après l'envoi du code HTML. Vous devrez faire la chose UpdatePanel dans l'autre sens. Je ne l'ai jamais fait auparavant, donc je ne peux pas vous conseiller, mais cherchez des exemples où une grille dans un panneau de mise à jour se lie à certaines données retournées dans une requête. Vous pouvez même trouver un exemple de faire la même chose avec un ObjectDataSource et un service WCF. –

Questions connexes