将WCF Windows服务作为InstanceContextMode.PerCall运行

时间:2014-10-08 15:43:50

标签: c# wcf .net-4.0 windows-services

我有一个WCF服务,它配置为作为Windows服务运行,但只有在我将InstanceContextMode设置为Single时才有效。当我将其更改为PerCall并重新启动时 - 安装它变得无法访问的服务。

有人可以澄清我是否运行WCF服务,因为Windows服务将上下​​文 HAVE 设置为Single,为什么会这样?

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class CateringSSTService : ICateringSSTService

更新:此处是托管代码

    private ICateringSSTService _cateringSSTService;
    private ServiceHost _serviceHost;
    private Task _executionTask;

    public CateringSSTServer()
    {
    }

    public void Start()
    {
        _executionTask = new Task(ManagerStartup);
        _executionTask.Start();
    }

    private void ManagerStartup()
    {
        try
        {
            _cateringSSTService = new CateringSSTService();
            _serviceHost = new ServiceHost(_cateringSSTService);
            _serviceHost.Open();
        }
        catch (Exception)
        {
        }
    }

    public void Stop()
    {
        try
        {
            if (_serviceHost != null && _serviceHost.State != CommunicationState.Closed)
            {
                _serviceHost.Close();
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

1 个答案:

答案 0 :(得分:1)

您正在创建单个对象并将其传递给ServiceHost的单例构造函数。这个ServiceHost如何在每次调用时创建一个新对象?那不行。

如果您需要PerCall(或PerSession或除Singleton之外的任何东西),您需要将类的类型传递给ServiceHost构造函数,以便它可以在运行时创建此类型的新实例

_serviceHost = new ServiceHost(typeof(CateringSSTService));

如果您没有默默地吞下异常,Runtime就会告诉您问题所在。对未来的问题应用一些适当的错误处理。