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

标签 c# .net wcf windows-services

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

我首先按照 Microsoft 在 How to: Host a WCF Service in a Managed Windows Service 上的说明进行操作.

我的 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;
        }
    }
}

在我的服务类中,我有一个队列和一个 Add 方法。添加方法返回添加后队列中的项目数。代码如下所示:

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

    public int Add(int reportId)
    {
        myQueue.Enqueue(reportId);
        return myQueue.Count;
    }
}

最后,我在 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();

我希望第一次运行测试时打印 1 和 2,然后第二次打印 3 和 4,然后第三次打印 5 和 6,依此类推。但是,它每次都只是简单地返回 1 和 2,就好像 Console App 是在实例化对象本身,而不是在 Windows Service 内部对对象进行操作。我有什么不明白的?

最佳答案

我认为您需要一个 singleton WCF 服务。参见 here .

默认情况下,WCF 服务的实例模式是per-call。因此,主机会为您进行的每次调用创建您的服务实例。

注意:使用单例服务时,您的操作需要线程安全。所以我建议从 Queue 切换到 ConcurrentQueue ,因此您可以处理多个并发客户端。

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

关于c# - WCF 服务托管 Windows 服务不保存调用之间的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11231822/

相关文章:

c# - 如何查询 Sharepoint 列表中每个值的最大 ID?

c# - 使用 MVC3 根据 Highchart 条形图中的值更改条形颜色

c# - Linq 组合左连接数据

c# - 在 .NET 中,为什么 SerialPort.ReadExisting() 返回一个字符串而不是字节数组?

.net - XmlDocument 混合内容 pretty-print 行为背后的基本原理是什么?

c# - 共享 [DataContract] 类的可移植类库

c# - 如何使用 ExecuteNonQuery 在 VARCHAR(MAX) 列中插入超过 8000 个字符?

javascript - 从 javascript 调用 WCF 后显示服务名称未定义

wpf - WPF 应用程序中的 WCF 数据服务安全性

c# - 无法访问添加到类库中的新类