Следуя инструкции здесь Я сам размещаю службу WCF внутри службы Windows.Моя служба WCF содержит глобальный объект, который я регулярно обновляю.Я хочу сериализовать этот объект в JSON и вернуть эту строку JSON через конечную точку службы.Когда я получаю доступ к конечной точке, которая вызывает метод serialize в сервисе, я получаю то, что представляется совершенно новым экземпляром глобала.Служба установлена на [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Я создаю экземпляр так же, как и учебник:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class MyWindowsService: ServiceBase
{public ServiceHost serviceHost = null;
public Service()
{
ServiceName = "MyService";
}
public static void Main()
{
ServiceBase.Run(new MyWindowsService());
}
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
serviceHost = new ServiceHost(typeof(MyWCFService));
serviceHost.Open();
}
protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}
И мой WCF-сервис выглядит так:
public class MyWCFService: IWCFService
{
private myObject = mySerializableObject;
public MyWCFService()
{
myObject = new MySerializableObject();
myObject.Init();
}
public Stream GetJSON()
{
MemoryStream stream = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(MySerializableObject));
ser.WriteObject(stream, myObject);
string jsonString = Encoding.ASCII.GetString(stream.ToArray());
byte[] resultBytes = Encoding.UTF8.GetBytes(jsonString);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new MemoryStream(resultBytes);
}
}
Если я GET
конечная точка GetJSON, возвращаемая строка является новой инициализацией объекта.Если я нарушу метод GetJSON, myObject покажет все вновь инициализированные значения.Размещение точки останова в коде обновления MySerializableObject показывает, что обновления выполняются правильно и сохраняются в объекте в памяти.
Выполнение того же кода в обычном консольном приложении работает нормально.Почему расхождение?Я неправильно обращаюсь с глобальным?