2012-04-07 2 views
0

ただWCFの周りに頭を抱えているので、控えめなコーディングのために私を許してください。 私が抱えている問題は、たとえ(と思っても)私は一度だけそれをやっているにもかかわらず、私は私のサービスに2回データを送信しているようです(スクリーンショットを参照)。 誰かが私に間違ったことを教えてもらえますか?あるいは、私が非効率的にそれをやっているならば、それを行うためのより良い方法を提案するだけです。WCF:サービスに2回提出する

コードは、次のとおりです。

public void EndOfLevel() 
    { 
     GlobalVariable.TotalQuestionsAsked = 10; 
     GlobalVariable.CorrectDecimal = GlobalVariable.Correct/GlobalVariable.TotalQuestionsAsked; 

     //Show loading screen 
     UploadingScreen.Visibility = Visibility.Visible; 
     //Submit this levels results. 

     Service1Client client = null; 
     client = new Service1Client(); 

      //Gather the results and details 
      Result thislevel = new Result(); 
      thislevel.Datetime = DateTime.Now; 
      thislevel.result = GlobalVariable.CorrectDecimal; 
      thislevel.TimesTable = GlobalVariable.NeedsHelpWith; 

      //submit them 
      try 
      { 
       client.SubmitResultAsync(thislevel); 
      } 
      catch 
      { 
       MessageBox.Show("Error uploading data"); 
      } 
      finally 
      { 
       client.Close(); 
       Results r3 = new Results(); 
       this.NavigationService.Navigate(r3); 
      } 



    } 

WCFテストクライアント:

Screenshot of the results

乾杯を、 ニック

+0

コードが2回実行されないようにするためにブレークポイントを設定しましたか? –

+0

Hey Preet - それを判断するためにどこにブレークポイントを置くべきですか? (また、はい、おそらくこれを知っているはずです...) –

+0

トレースなどに書き込むことがあります。 EndOfLevel()メソッドが複数回呼び出されないようにする必要があります。 –

答えて

1

私は可能性がある場合は、ここで私たちのWPFの間で、当社の非同期呼び出しを管理するためのパターンですアプリケーションとWCFサービス。クライアントへの接続が前にserviceメソッドの呼び出しに開いていることを保証私たちは私たちのサービスクライアントにパブリックアクセサを持っている。このセクションでは

public static MyServiceClient Client 
{ 
    get 
    { 
     return GetMyServiceClient(); 
    } 
} 
private static MyServiceClient client; 

private static MyService.MyServiceClient GetMyServiceClient() 
{ 
    VerifyClientConnection(); 

    return client; 
} 

private static void VerifyClientConnection() 
{ 
    if (client == null || client.State == System.ServiceModel.CommunicationState.Closed) 
    { 
     client = new MyService.MyServiceClient(); 
    } 
} 

、このセクションでは、私たちの非同期の一例です(この例では、私たちは私たちのサービスに例外データを渡すために使用しているデリゲートとコールバックを示して)を呼び出し、コールバックパターン:この例では

public delegate void LogExceptionCompletedEvent(); 
public static LogExceptionCompletedEvent LogExceptionCompleted; 

public static void LogExceptionAsync(SilverlightException exception) 
{ 
    string json = JsonConvert.SerializeObject(exception); 

    Client.LogExceptionCompleted -= client_LogExceptionCompleted; 
    Client.LogExceptionCompleted += client_LogExceptionCompleted; 
    Client.LogExceptionAsync(json); 
} 

private static void client_LogExceptionCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    if (LogExceptionCompleted != null) 
    { 
     LogExceptionCompleted(); 
    } 
} 

、ビューモデルはLogExceptionCompletedデリゲートにイベントハンドラをアタッチし、中に可能性があり順番サービスから戻ったときにコールバックの結果を受け取ります。

基本的には、アプリケーションから作成する必要がある非同期WCFサービス呼び出しに対してこのパターンを繰り返します。このパターンは、非常に組織化され、ユニットテスト可能な状態に保たれます。

+0

ニース!それは本当にうまくいっています - 私たちがやっていたことよりもずっとおしゃれです、ありがとう! –

+0

クールで幸せに助けてください – KodeKreachor

関連する問題