我在ASP.NET Web API应用程序中使用Portable.Licensing。我正在使用Startup.cs
中启动的每日后台任务,使用System.IO.File.ReadAllText
检查许可文件和公钥。如果在检查后未验证许可证,我想让应用程序停止工作,直到安装更新的许可证文件。
通过“停止工作”我的意思是Web API请求不应该通过,或者应该停止或卸载整个Web API应用程序。许可证已过期,他们无法使用该应用程序。
我解释过的许可证检查部分有效,但我找不到在应用程序运行时让应用程序停止工作的方法。我试过了,但请求似乎仍然有效
AppDomain.Unload(AppDomain.CurrentDomain);
一种简单的方法是将许可证检查放在每个http请求方法或过滤器中并返回错误,但我想避免这种情况。每次检查许可证时都会执行IO file read
,我认为这可能会导致性能问题。
有没有办法实现这个目标?
答案 0 :(得分:1)
我们有通过WebAPI应用程序包装每个请求的工具。我们在启动时安装一次,如下所示:
config.MessageHandlers.Add(new InstrumentAllCallsHandler());
在.ctor中,您可以加载文件并存储过期日期。在处理程序中,您只需检查当前日期并通过管道转发请求或在过期日期已过的任何您想要做的事情进行响应。
答案 1 :(得分:0)
在Global.asax.cs
Application_Start
我加载了像这样的值
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["licenseExp"] = licenseManager.ExpirationDate;
System.Web.HttpContext.Current.Application.UnLock();
然后我创建了一个ActionFilterAttribute
(使用Web API),每个http请求都会调用它。在ActionFilter中
public override void OnActionExecuting(HttpActionContext actionContext)
{
DateTime licenseExp = DateTime.Parse(System.Web.HttpContext.Current.Application["licenseExp"].ToString());
if (DateTime.Compare(licenseExp, DateTime.UtcNow) < 0)
{
throw new Exception("Your license has expired.");
}
}
这会在许可证中强制执行到期日期,并且无需读取每个请求的IO许可证。 @ADyson的评论对找到这个解决方案贡献最大,但没有退款也没有退货。