2011-08-10 3 views
0

JSONとXMLでAJAXサービスを作成しています(this example)。WCF WebServiceHostFactoryとタイマー

function GetTimersTick() { 

     // Create HTTP request 
     var xmlHttp; 
     try { 
      xmlHttp = new XMLHttpRequest(); 
     } catch (e) { 
      try { 
       xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
       try { 
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
       } catch (e) { 
        alert("This sample only works in browsers with AJAX support"); 
        return false; 
       } 
      } 
     } 

     // Create result handler 
     xmlHttp.onreadystatechange = function() { 
      if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { 
       document.getElementById("result").value = xmlHttp.responseText; 
       document.getElementById("statustext").value = xmlHttp.getAllResponseHeaders(); 
      } 
     } 


     // Build the operation URL 
      var url = "service.svc/"; 
      url = url + "GetTimersCallCount"; 
      xmlHttp.open("POST", url, true); 
      xmlHttp.setRequestHeader("Content-type", "application/json"); 
      xmlHttp.send(); 
    } 

しかし、私は私はこの機能でボタンを押すと、サービスは0何が問題になっていますから取得:私はこれを行うjavascriptのページで

[ServiceContract(Namespace = "XmlAjaxService")] 
     public interface ICalculator 
     { 
      ... 

      [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
      int GetTimersCallCount(); 
     } 

public class CalculatorService : ICalculator 
    { 
     private System.Timers.Timer timer = null; 
     private int timerCalls = 0; 

     public CalculatorService() 
     { 
      timer = new System.Timers.Timer(); 
      timer.Interval = 1000; 
      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
      timer.Start(); 
     } 

     public int GetTimersCallCount() 
     { 
      return this.timerCalls; 
     } 
} 

:service.csで 私は変更を加えますか?

+0

あなたのサンプルコードからわかる限り、あなたは決して 'timerCalls'を更新しません。 –

+0

更新情報私はここにこのコードを表示することをお見逃し – amaranth

答えて

0

なぜなら、CalculatorServiceクラスのインスタンスは1つではないからです。新しいサービスが呼び出されるたびに再作成されます。

、シングルインスタンス・モードを有効にするあなたのサービス実装クラスに、次の属性を使用するには、次の

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class CalculatorService : ICalculator { ... } 

は、シングルインスタンス・モードを使用しているとき、あなたはあなたのサービスのメソッドへの呼び出しを同期する必要があることに注意してください。特定の例では、32ビット整数(アトミック演算)のみを読み書きするため、これは必要ではありません。

+0

riginal質問のためのロナルドありがとうございます。そして2番目のサービスでは、OPCからデータを取得してクライアントに送信したいのですか?この例のように。 OPCサーバーから1〜5秒ごとにデータを受信し、IList にデータを格納したいとします。クライアントが私のサービスメソッドを要求すると、JsonまたはXmlでデータIList が返されます。ありがとう – amaranth

+0

私はページを更新しない場合や、私はリクエストサービス返信0を送信する場合、数分(10または15)後にリクエストを送信しない場合。私はこの時間の設定を変更する?ありがとう。 – amaranth

+0

サービスクラス内ではなく、別のコンポーネントでこの種のロジックを設定します。このコンポーネントは、5秒ごとにOPCサーバーをポーリングし、その結果をデータベースに保管します。その後、WCFサービスはデータベースから読み取り、結果をクライアントに送信します。 –

関連する問題