我创建了一个 Windows Communication Foundation 服务(本例中的 appDomain 是一个 Windows 窗体应用程序),它将其 serviceType 类初始化为单例:
启动服务工作。从客户那里拨打电话有效。但是,如果服务使用上面的代码调用自身(“//对服务进行第一次调用?”),我会得到一个 System.TimeoutException。
private static myDataService.DataProvider.CustomSingletonClass obs;
public DataProviderServiceType()
{
//Create the object if needed. This should only be required first time.
if (obs == null)
{
obs = new myDataService.DataProvider.CustomSingletonClass();
//Instruct the class to read its configuration and initialize.
obs.initializeSingletonClass(null);
}
}
单例类有一个将在其初始化时启动的计时器对象。因此,一旦客户端对服务进行调用,就会实例化类,启动计时器,并且对象将继续存在,其计时器对象会定期触发。
对于上下文,计时器的事件将更新单例的属性。目的是让单例类定期执行计算,将数据保存在其属性中,并将属性中的任何内容返回给调用客户端。这样,执行定期(基于时间)计算的调用受到限制,并且所有客户端都会收到相同的更新数据。
问题是,一旦托管服务,它只需要一个客户端来调用要创建的单例实例并启动计时器。
SetListText("Starting Service...");
host_DataService = new ServiceHost(serviceType_Data);
host_DataService.Open();
SetListText("Service is now available.");
我希望服务通过一次调用来初始化单例类,以便第一个发出请求的客户端不必等待配置和初始化发生;程序启动时要刷新的数据。就在“SetListText(”服务现在可用。“)之后;” 我有以下内容:
//Make the 1st call to the service?
EndpointAddress endpointAddress = new EndpointAddress("http://localhost:8000/myDataService/DataProvider/TimedCalculator");
BasicHttpBinding serviceBinding = new BasicHttpBinding();
serviceBinding.CloseTimeout = new TimeSpan(0, 1, 0);
serviceBinding.OpenTimeout = new TimeSpan(0, 1, 0);
serviceBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
serviceBinding.SendTimeout = new TimeSpan(0, 1, 0);
DataProviderClient client = new DataProviderClient (serviceBinding, endpointAddress);
String[][] ArrStr = client.retrieveList();
有没有办法让 WCF 服务在同一个 appDomain 中调用自身,或者这是否合理不受欢迎?是否有理由放弃这个自调用代码而只接受第一个客户的服务调用?