Событие для «Слушателя» не запускается в asp.net, но работает в консольном приложении c # - PullRequest
0 голосов
/ 14 мая 2019

Я реализовал «Apache Geode» в консольном приложении и успешно выиграл формы.

Я преобразовал это решение в «Библиотеку классов».

Когда я вызываю эту библиотеку классов для настройки «Cache Listener», она работает в консольном приложении, но не в приложении asp.net (MVC).

Я пытался вызвать эту dll внутри MVC HomeController внутри метода Index (). Вот что внутри dll:

    internal void RegisterQuoteListener(Cache c, string quoteReqId, Action<string, Quote> AddQuote,
                                        Action<string, QuoteAcknowledgement> AddQuoteAck,
                                        Action<string, QuoteCancel> AddQuoteCancel)
    {
        List<string> s = new List<string>();
        s.Add(quoteReqId);

        IRegion<string, Object> q = c.GetRegion<string, Object>("quote");

        try
        {
            q.GetSubscriptionService().RegisterKeys(s);
            q.AttributesMutator.SetCacheListener(new LQuote<string, Object>(this, AddQuote, AddQuoteAck, AddQuoteCancel));
        }
        catch (Exception ex)
        {
            new ApplicationException("Can't register key: " + quoteReqId, ex);
        }
    }



    public override void AfterCreate(EntryEvent<TKey, TVal> ev)
    {
        HandleCreateAndUpdate(ev);
    }

То, как это должно работать, заключается в том, что вы настраиваете прослушиватель для определенного ключа, а затем, когда любое сообщение приходит в этот регион с тем же ключом, оно должно инициировать событие, называемое "public override void AfterCreate (EntryEvent ev)"

Существует ли ограничение MVC, которое отличается от консольного приложения в этом примере?

Я могу предоставить больше информации по вашим вопросам.

EDIT1

Внутри MVC HomeController я называю этого помощника так:

 public ActionResult Index()
    {
        //var a = new Geode().QuoteRequestWrapper("EUR", "GBP", "GBP", DateTime.Now.Date.AddDays(14), 10, "any reference", true);

        //Create Instance
        Geode geode = new Geode();

        //Initialize Cache
        geode.InitializeCache(ip, port, pool);

        //Send Geode message
        geode.GeodePut("region1", Guid.NewGuid().ToString().Substring(0, 8).ToUpper(), "Starting Geode Test");

        //Quote request - single
        geode.QuoteRequest("EUR", "GBP", "GBP", DateTime.Now.Date.AddDays(14), 10, "any reference", true);
        return View();
}

внутри geode.QuoteRequest он устанавливает «Слушатель», который должен инициировать событие в метод из инициализированного кэша. Но действие никогда не называется.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Вот ответ: Как я могу заставить CacheListenerAdapter работать в ASP.NET?

Если вы используете версию GemFire ​​Native Client менее 10.0.0 тогда вы, вероятно, столкнетесь с проблемой AppDomain в ASP.NET.Хотя многие проблемы с доменом приложений устранены в 9.x, некоторые из них просто невозможно решить в этой версии.Обновление до последней версии 10.x должно решить вашу проблему.

0 голосов
/ 14 мая 2019

Как именно вы называете эту dll в контроллере? Контроллер не является одноэлементным, новый экземпляр будет создаваться при каждом запросе, поэтому, если вы сохраняете экземпляр своего вспомогательного класса в свойстве для контроллера, ваши настройки не будут сохраняться.

В идеале вы должны использовать DI-контейнер, который может внедрить единственный экземпляр вашего вспомогательного класса в контроллеры. Вы также можете попробовать использовать статический параметр.

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