Приложение WCF в IIS7: потеря единичного экземпляра - PullRequest
1 голос
/ 13 октября 2010

У меня есть приложение WCF с несколькими веб-сервисами WSDL, размещенное в IIS7 на 64-битной Windows Server 2008.

Приложению требуется, чтобы синглтон был назначен с некоторыми значениями конфигурации один раз, когда вызывается первый метод веб-сервиса(независимо от того, что вызывается первым).

Редактировать: Бэкэнд системы требует использования этого одноэлементного подхода.

Конфигурацию назначают один раз, нозначения снова становятся нулевыми ....

Вот код (упрощенно):

public class SingletonSettings 
{
    private static readonly SingletonSettings _s;

    public SingletonSettings Instance { get {return _s;} }

    public object SomeValue { get; set; }
}

public abstract class AbstractWebservice 
{
    static AbstractWebservice() 
    {
        WebserviceGlobalInitializer.Initialize();
    }

}
//Just a webservice
public class Webservice1 : AbstractWebservice, ISomeServiceConctract1 
{
    public void DoStuff1();
}

//Just a webservice
public class Webservice2 : AbstractWebservice, ISomeServiceConctract2
{
    public void DoStuff2();
}

internal class WebserviceGlobalInitializer
    {
        private static readonly object Lock = new object();
        private static bool Initialized = false;

        public static void Initialize()
        {
            lock (Lock)
            {
                if (!Initialized)
                {
                    InitStuff();

                    Initialized = true;
                }
            }
        }

        private static void InitStuff()
        {            
            string s = SingletonSettings.Instance.SomeValue = "just a ref";
        }
    }

WebserviceGlobalInitializer.InitStuff() вызывается только один раз.Тем не менее SingletonSettings.SomeValue становится нулевым .....

Проблема возникает случайно.

Я пытался

1) Вызвать WebserviceGlobalInitializer.Initialize() из обычного конструктора в базекласс.

2) Комментарий: Initialized = true; в надежде на то, что настройки будут каждый раз инициализироваться (что приводит к значительным накладным расходам, так что в любом случае это не будет долгосрочным решением)

Тем не менеезначение становится нулевым.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 13 октября 2010

При повторном использовании процесса все состояния, которые не находятся в состоянии сеанса или состоянии приложения, исчезнут в черную дыру. Это, на первый взгляд, включает в себя статические переменные, одна из которых является экземпляром синглтона.

Мне кажется, что InstanceContextMode для singleton был реализован как переменная в состоянии приложения ASP.NET. Чтобы проверить это, я сделаю сегодня несколько размышлений и обновлю свой ответ.

UPDATE

НЕТ ЭТОГО НЕ СУЩЕСТВУЕТ !!! При перезапуске процесса, даже если вы установите режим Instancing WCF в значение Single, вы потеряете все состояние, которое у вас было с единичным экземпляром (например, счетчик, что угодно) с процессом утилизация.

1 голос
/ 15 октября 2010

После нескольких дней поиска я нашел источник проблемы. Ответ Алиостада подсказал мне.

Мой веб-сервис использует конфигурации поведения. Один с аутентификацией и один без. Аутентификация / обработка сеанса реализована в IDispatchMessageInspector, который вызывается до загрузки веб-сервиса.

Проблема возникла, когда приложение, которое использует мой веб-сервис, было подключено к сети, когда пул приложений был переработан. Затем приложение отправит запрос в веб-службу с использованием аутентифицированного поведения. Реализация IDispatchMessageInspector будет затем пытаться загрузить параметры, но они еще не были инициализированы из статического конструктора в веб-службе ....

Спасибо за ответы ...

0 голосов
/ 13 октября 2010

Вы можете использовать инфраструктуру времени выполнения WCF, чтобы позаботиться об этом за вас.Попробуйте добавить следующий атрибут в класс WebService:

[ServiceBehavior( ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...