WCF服务托管Windows服务不保存调用之间的状态

Sli*_*345 3 .net c# wcf windows-services

我正在尝试创建一个简单的Windows服务,它维护一个整数队列,并通过WCF调用接受来自其他应用程序的新整数.我当前的实现似乎为每个与它通信的应用程序维护单独的队列,这不是我想要的.

我首先按照Microsoft的说明,如何:在托管Windows服务中托管WCF服务.

我的WindowsService类看起来像这样:

public class MyWindowsService : ServiceBase{
    public ServiceHost serviceHost = null;

    public MyWindowsService(){
        ServiceName = "AdHocReportService";
    }
    public static void Main(){
        ServiceBase.Run(new MyWindowsService());
    }

    protected override void OnStart(string[] args){
        if (serviceHost != null)
            serviceHost.Close();

        serviceHost = new ServiceHost(typeof(MyService));
        serviceHost.Open();
    }
    protected override void OnStop(){
        if (serviceHost != null){
            serviceHost.Close();
            serviceHost = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的Service类中,我有一个队列和一个Add方法.add方法在add之后返回队列中的项目数.代码如下所示:

public class MyService : IMyService
{
    private Queue<int> myQueue= new Queue<int>();

    public int Add(int reportId)
    {
        myQueue.Enqueue(reportId);
        return myQueue.Count;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我使用ConsoleApp中的以下代码测试我的服务:

MyServiceClient client = new MyServiceClient();
int count = client.Add(10);
Console.WriteLine(count);  //prints 1
count = client.Add(25);
Console.WriteLine(count);  //prints 2
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

我希望在我的测试第一次运行时打印1和2,然后第二次打印3和4,然后在第三次打印5和6,依此类推.但是,它每次只返回1和2,就像控制台应用程序实例化对象本身而不是在Windows服务内的对象上操作一样.我不明白的是什么?

Mar*_* N. 5

我想你想要一个singletonWCF服务.看到这里.

默认情况下,WCF服务的实例模式是per-call.因此,主机会为您进行的每个呼叫创建服务实例.

注意: 使用单件服务时,您的操作需要是线程安全的.所以我建议从a切换Queue到a ConcurrentQueue,这样你就可以处理多个并发客户端.

替代方案:使用a MSMQ binding.这将确保您所有传入的消息都排队等待进程,因此也会在重新启动之间保持不变.