WCFs WebServiceHostFactory и таймеры - PullRequest
       7

WCFs WebServiceHostFactory и таймеры

0 голосов
/ 10 августа 2011

Я создаю службу AJAX с JSON и XML из этого примера . В service.cs вносим изменения:

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

На странице JavaScript я делаю это:

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. Что не так?

1 Ответ

0 голосов
/ 10 августа 2011

Причина в том, что не существует ни одного экземпляра вашего CalculatorService класса. Он воссоздается при каждом новом обращении к службе.

Чтобы включить режим одного экземпляра, используйте следующий атрибут в классе реализации службы:

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

Помните, что при использовании режима одного экземпляра вам может потребоваться синхронизировать вызовы с вашими методами обслуживания. В вашем конкретном примере это не обязательно, так как вы читаете и пишете только 32-битное целое число (что является атомарной операцией).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...