2009-08-13 22 views
0

私はWCFコールバックをwpdualhttpbindingを使用してasp.net Webアプリケーションに実装しました。私のページのgridviewの行を更新するために使いたいと思います。私は更新パネルにgridviewを配置し、コールバックはクライアント上で発生しますが、グリッド内のデータは決して更新されません。私は無駄にdatabindを呼び出した後、更新パネルのUpdate()メソッドを呼び出すことを試みました。私が行方不明になっていることや、これを働かせるために何か必要なことがありますか?ここでWCFコールバックを使用してasp.net gridviewデータを更新する

は、私が使用していたコードの一部です:

ページロードでは、私は、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 
} 
+0

コードを表示する必要があります。特に、サービスの呼び出し方法を示し、コールバックを表示します。 –

+0

元の投稿にコードを追加しました –

答えて

1

コールバックが起こるんe Subscribe操作、またはPage_Loadの後Page_Loadの後に起こった場合、私は、コールバックが発生したときにページがまだ周囲にあるかどうかについて懸念しています。

do各リクエストで新しいページインスタンスが作成されることを認識していますか?そして、HTMLがクライアントに送信されると、インスタンスは破棄されますか? HTMLがクライアントに送信されると、サーバーがそのHTMLを変更することはできません。

+0

コールバックはPage_Loadの後に発生します。このコードは、コールバックが発生したときに周囲に存在しないインスタンスがサブスクライバリストから削除され、それ以上送信されないように記述されています。 私が読んでいることから、私がしようとしていることをすることはできませんか? –

+0

WCFコールバックがページに触れ、GridView上でバインドを試みることができることをデバッガを使って見ることができますが、あなたが書いているように、UpdatePanelを使ってもグリッドを更新することはできません新しいデータあれは正しいですか? –

+1

これは正しいです。また、私がインスタンスを言ったとき、私はWCFインスタンスではなくページインスタンスを意味しました。ページは、HTMLが送信された直後に破棄されます。あなたはUpdatePanelのことを逆にしなければなりません。私はそれを前にやったことがないので、アドバイスはできませんが、更新パネルのグリッドがクエリで返されたいくつかのデータにバインドする例を探します。 ObjectDataSourceとWCFサービスで同じことを行う例を見つけることさえできます。 –

関連する問題