我已经在控制台应用程序中实现了“ 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
内部,它设置了一个“侦听器”,该侦听器应将事件从已初始化的缓存中触发到方法中。但是行动从未被召唤。
答案 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 应该解决您的问题。