2017-09-21 1 views
0

Ich verwende Portable.Licensing in meiner ASP.NET Web API-Anwendung. Ich verwende eine tägliche Hintergrundaufgabe, die unter Startup.cs gestartet wurde und eine Lizenzdatei und einen öffentlichen Schlüssel unter Verwendung von System.IO.File.ReadAllText überprüft. Wenn die Lizenz nach der Überprüfung nicht validiert wird, möchte ich die Anwendung so lange stoppen, bis eine aktualisierte Lizenzdatei installiert ist.Erzwingen einer abgelaufenen Lizenz ASP.NET Web API

Mit "stop working" meine ich Web-API-Anfragen sollten nicht durchlaufen oder die gesamte Web-API-Anwendung sollte gestoppt oder entladen werden. Die Lizenz ist abgelaufen, sie sollten die Anwendung nicht verwenden können.

Der Lizenzprüfungsabschnitt, den ich erklärt habe, funktioniert, aber ich kann keinen Weg finden, die Anwendung zu stoppen zu arbeiten, während die Anwendung bereits ausgeführt wird. Ich habe dies versucht, aber Anfragen scheinen noch

AppDomain.Unload(AppDomain.CurrentDomain); 

Eine einfache Möglichkeit, die Lizenzprüfung in jedem HTTP-Request-Verfahren oder in einem Filter zu setzen wäre, zu arbeiten und einen Fehler zurück, aber ich möchte, dass vermeiden. Das ist IO file read wird jedes Mal durchgeführt, wenn es die Lizenz überprüft und ich denke, dass dies zu Leistungsproblemen führen kann.

Gibt es Möglichkeiten, dies zu erreichen?

+1

Können Sie es beim ersten Mal in die Sitzung laden und dann von dort in Ihrem Filter lesen, um Festplatten-E/A zu vermeiden? – ADyson

+0

@ADyson Ich werde das untersuchen und es könnte funktionieren. – Heinrich

Antwort

0

Im Global.asax.csApplication_Start geladen ich die Werte wie diese

System.Web.HttpContext.Current.Application.Lock(); 
System.Web.HttpContext.Current.Application["licenseExp"] = licenseManager.ExpirationDate; 
System.Web.HttpContext.Current.Application.UnLock(); 

Dann habe ich eine ActionFilterAttribute (unter Verwendung von Web-API), die auf jeder HTTP-Anforderung aufgerufen wird. Im Action

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."); 
     }    
    } 

Dies erzwingt das Ablaufdatum in der Lizenz und wird nicht jede Anfrage zu tun, lesen Sie benötigen eine IO-Lizenz. Der Kommentar von @ADyson hat am meisten dazu beigetragen, diese Lösung zu finden, aber No Refunds No Returns hat auch dazu beigetragen.

1

Wir haben Instrumentierung, die jede Anfrage über unsere WebAPI-App abwickelt. Wir installieren es einmal beim Start wie folgt:

config.MessageHandlers.Add(new InstrumentAllCallsHandler()); 

In Ihrem .ctor können Sie Ihre Datei laden und das Ablaufdatum speichern. Im Handler müssen Sie nur das aktuelle Datum überprüfen und antworten, indem Sie die Anfrage über die Pipeline weiterleiten oder was auch immer Sie tun möchten, wenn das Ablaufdatum überschritten wird.