我想在每个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);
答案 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
。这将解决问题。