WCF WebServiceHostFactory和计时器

时间:2011-08-10 07:12:06

标签: c# ajax wcf json service

我使用this example中的JSON和XML创建AJAX服务。 在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 :(得分:0)

原因是您的CalculatorService课程没有一个单一实例。它会在每次调用该服务时重新创建。

要启用单实例模式,请在服务实现类上使用以下属性:

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

请注意,使用单实例模式时,可能需要将调用与服务方法同步。在您的具体示例中,这不是必需的,因为您只是在读取和写入32位整数(这是一个原子操作)。