2016-11-04 3 views
0

Ich habe eine ASP.NET Web API, die ich geschrieben und veröffentlicht habe. Nun, da wir da draußen sind, schauen wir uns einige Verbesserungen an, und diese Verbesserungen beinhalten Änderungen an bestimmten Aufrufen, was bedeutet, dass wir eine Version benötigen, um bestehende Clients funktionsfähig zu halten.API Versionierung in ASP.NET Web API

Ich habe Attribut-Routing bisher in meiner App verwendet. Methoden werden aufgerufen von: Controller/Action über RoutePrefix und Route-Attribute.

Wenn ich eine V2 meiner Klassen erstellen muss, möchte ich nur die tatsächlich geänderten Klassen neu erstellen und andere Routen zurück in v1-Klassen umleiten, da sie nicht geändert wurden. (Sonst habe ich nur eine Menge Code oder doppelten Code).

Was ich will, ist, tun die folgenden Routen für meine Version v1 von Klassen arbeiten: Controller/Aktion

Für V2 Ich möchte keine neuen Klassen V2 gehen, und alle Klassen, die sich nicht verändert haben Ich möchte den HttpControllerDescriptor von V1-Klasse zurückgeben. Die Route würde wie v2/Controller/Action aussehen, würde aber zu Controller/Action umgeleitet werden.

Ich habe eine IHttpControllerSelector implementiert und die entsprechenden HttpControllerDescriptors zurückgeben, aber es nicht den Aufruf in die Methode. Ich glaube, weil die Routing-Informationen nicht mit der Aktion übereinstimmen. (Wenn ich einen IHttpActionSelector einfüge und die Ausnahme nachspüre, heißt es, "mehrere Aktionen wurden gefunden, die der Anfrage entsprechen).

Also ich denke ich frage mich: Ist das überhaupt möglich? Ist das der beste Weg? zu erreichen, was ich versuche zu tun?

+0

Dies könnte Ihnen helfen: http: //www.culbertsonexchange.com/wp/? P = 318.Wenn Sie das erreichen wollen, was Sie in Ihrer Frage erwähnt haben, müssen Sie Ihre eigene Logik für das Attribut-Routing implementieren. –

Antwort

0

Hier ist, was ich für die Unterstützung der Versionierung in asp.net Web API implementiert.Wichtig zu beachten Ich habe nicht verwendet Attribut Routing aber explizite Routen in WebApiConfig.cs also, wenn Sie folgen wollen In diesem Muster müßte man wieder auf explizite Routen umschalten.Außerdem bevorzuge ich keine Versionsinformation in der tatsächlichen Route, ich benutze einen benutzerdefinierten (dh "Version") Parameter im Accept-Header.Ich setze auch die Version pro Mime-Typ wie in Im folgenden Beispiel: Wenn die Versionsnummer nicht vom Client festgelegt wurde oder die angeforderte Version nicht existiert, wird dies der Fall sein zurück zum Standard-Controller.

  1. Erstellen Sie eine Klasse und erben von DefaultHttpControllerSelector so können Sie auf Basisklasse Verhalten Notlösung, wenn man wollte.

  2. Aufschalten SelectController Methode als solche:

    öffentliche Überschreibung HttpControllerDescriptor SelectController (HttpRequestMessage Anfrage) {

IDictionary Controller = GetControllerMapping(); IHttpRouteData routeData = request.GetRouteData();

   string controllerName = (string)routeData.Values["controller"]; 

       HttpControllerDescriptor controllerDescriptor; 

       if (string.IsNullOrWhiteSpace(controllerName)) 
       { 
        return base.SelectController(request); 
       } 

       if (!controllers.TryGetValue(controllerName, out controllerDescriptor)) 
       { 
        return null; 
       } 

       string version = GetVersionFromAcceptHeader(request); 
       if (string.Equals(version, "1")) 
       { 
        return controllerDescriptor; 
       } 

       string newName = string.Concat(controllerName, "V", version); 

       HttpControllerDescriptor versionedControllerDescriptor; 
       if (controllers.TryGetValue(newName, out versionedControllerDescriptor)) 
       { 
        return versionedControllerDescriptor; 
       }   

       return controllerDescriptor; 
      } 
  1. Registrieren Dieser Controller Wähler in Ihrem webapiconfig Register Methode:

    config.Services.Replace (typeof (IHttpControllerSelector), neue YourControllerSelector (config));