“监听器”上的事件未在asp.net中触发,但在控制台应用程序C#中有效

时间:2019-05-14 09:16:40

标签: c# asp.net apache events

我已经在控制台应用程序中实现了“ Apache Geode”,并成功赢得了表单。

我已将此解决方案转换为“类库”。

当我调用此类库来设置“缓存侦听器”时,它可以在控制台应用程序上运行,而不能在asp.net(MVC)应用程序上运行。

我尝试在Index()方法内的MVC HomeController中调用此dll。 这是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);
    }

它的工作方式是为特定键设置一个侦听器,然后当任何消息使用相同键到达该区域时,它应触发一个名为 “公共重写无效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 :(得分:0)

您究竟如何在Controller中调用该dll?控制器不是单例,将在每个请求上创建一个新实例,因此,如果将助手类的实例存储在控制器的属性上,则设置将不会保留。

理想情况下,您将使用DI容器,该容器可以将帮助程序类的单例实例注入到控制器中。您也可以尝试使用静态参数。

答案 1 :(得分:0)

这是答案: How can I make the "CacheListenerAdapter" work in ASP.NET?

  

如果您使用的GemFire Native Client版本低于10.0.0   那么您很可能在ASP.NET中遇到AppDomain的问题。   虽然在9.x中缓解了许多AppDomain问题,但有些问题并没有解决   可能以该版本解决。更新到最新的10.x   应该解决您的问题。