尽管设置了InstanceContextMode.Single,WCF在每次调用时都使用一个新实例

时间:2014-05-01 21:06:45

标签: c# .net wcf

我想在每个WCF调用上重用相同的主机实例。我在互联网上读到的所有内容都说完全相同;使用[ServiceBehavior]属性。所以,这就是我所做的:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class DALService : IDataAccess
{
    private string _adminConnStr;

    public void ServiceStart()
    {
        _adminConnStr = ConnectionStringManager.GetAdminDatabaseConnectionString();
    }

    public IEnumerable<CustomerInfo> GetCustomerInfosOrderedByShortname()
    {
       // _adminConnStr is null here!
    }
}

我在ServiceStart设置了一个断点,以确保它正在运行。我在GetCustomerInfo中设置了断点,_adminConnStr再次为空。我还在*this设置了一个手表,地址确实不同。

我想知道这是因为我是以编程方式创建ServiceHost对象,而不是使用IIS为您设置所有这些内容。也许在创建主机时我需要做更多的事情?这是我的代码:

var contract = attribute.ContractType;

var serviceHost = new ServiceHost(attribute.ServiceType ?? instance.GetType());
serviceHosts.Add(serviceHost);

var uri = String.IsNullOrEmpty(service.UriPrefix)
    ? new Uri(String.Format("http://{0}:{1}/{2}", serverName, port, contract.Name))
    : new Uri(String.Format("http://{0}:{1}/{2}/{3}", serverName, port, service.UriPrefix, contract.Name));

if (uris.Contains(uri))
    throw new DuplicateServiceRegistrationException(uri);

uris.Add(uri);
serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior
{
    HttpGetEnabled = true,
    HttpGetUrl = uri
});

serviceHost.AddServiceEndpoint(contract, new BasicHttpBinding(), uri);
serviceHost.Open();
instance.ServiceStart(); // This line will set _adminConnStr

Console.WriteLine("{0} now listening at: {1}", service, uri);

1 个答案:

答案 0 :(得分:0)

想出来。

似乎 WCF 在第一次调用它之前不会设置您的Singleton实例。基本上在这一行之后:

var serviceHost = new ServiceHost(attribute.ServiceType ?? instance.GetType());

serverHost.SingletonInstance将为null。所以,当我打电话时:

instance.ServiceStart();

我在WCF不知道的实例上调用ServiceStart

因此,我需要在创建serviceHost时在WCF上设置单例实例:

var serviceHost = new ServiceHost(instance);

然后,我可以在那个实例上调用.ServiceStart。这将解决问题。