2014-10-15 7 views
13

Ich habe kürzlich Microsoft.AspNet.WebApi.WebHost zu einem MVC WebAPI-Projekt hinzugefügt, das es mir ermöglichen würde, das Attribut [Route("api/some-action")] für meine Aktion zu verwenden. Ich habe einige Fehler mit this article gelöst, kann aber den dritten Fehler unten nicht lösen. Die unten aufgelösten Fehler wurden hinzugefügt, um Feedback zu erhalten, wenn ich etwas falsch gemacht habe.Eine Route mit dem Namen 'MS_attributerouteWebApi' befindet sich bereits in der Routensammlung

erster Fehler: Es wurde keine Aktion auf dem Controller 'X' gefunden, die den Namen übereinstimmt 'some-Aktion'
Lösung: config.MapHttpAttributeRoutes(); zu WebApiConfig.cs Register Methode hinzugefügt.

Zweiter Fehler: System.InvalidOperationException Das Objekt wurde noch nicht initialisiert. Stellen Sie sicher, dass HttpConfiguration.EnsureInitialized() im Startup-Code der Anwendung nach allen anderen Initialisierungscodes aufgerufen wird.
Lösung: GlobalConfiguration.Configure(WebApiConfig.Register); Hinzugefügt Application_Start

Dritter Fehler Global.asax.cs: System.ArgumentException: Eine Route namens 'MS_attributerouteWebApi' ist bereits in der Route-Kollektion. Routennamen müssen eindeutig sein.
Lösung =?

Ich habe bereits versucht, alle DLLs aus bin Ordner nach this post zu reinigen und zu löschen.

Antwort

5

Gelöst! Die Zeile WebApiConfig.Register(GlobalConfiguration.Configuration); wurde von Global.asax.cs Application_Start entfernt.

+1

GlobalConfiguration.Configure (WebApiConfig.Register); war die erste Zeile in meinem global.asax und es scheint das gleiche zu tun. –

5

Ich habe durch Säubern des Deployment-Verzeichnisses vor dem Kopieren der neuen Dateien gelöst. Wahrscheinlich gab es eine alte Datei, die versucht, den gleichen Stamm mehrmals zu registrieren.

+0

Ich hatte Rogue DLLs in meinem bin-Ordner nach einem Projekt umbenennen. Reinigung des Projekts hat nicht geholfen, also musste ich die DLLs manuell durch Explorer löschen – oscilatingcretin

+0

Ich hasse diese Art von Lösung, aber in diesem Fall. funktioniert. – AFetter

26

Ich hatte ein ähnliches Problem, und es wurde auf eine Kopie Paste Fehler meinerseits im Zusammenhang, wo ich eine Kopie dieser Zeile in meiner WebApiConfig.cs Datei hinzugefügt:

config.MapHttpAttributeRoutes();

stellen Sie sicher, dass Sie nur eine von diesen haben.

+1

oder wie ich Duplikation war in Global.asax.cs mit GlobalConfiguration.Configure (config => config.MapHttpAttributeRoutes()) –

2

Für jeden, der darüber stolpert wie ich, wird dieser Fehler passieren, wenn Sie den Assembly-Namen (Projekteigenschaften) umbenennen. In meinem Fall habe ich ein Projekt umbenannt und bin in die Eigenschaften gegangen, um den Assemblynamen zu ändern (was VS2013 nicht für Sie tun wird).

Da der Assemblyname unterschiedlich ist, entfernt ein Clean oder Rebuild die "alte" Assembly nicht, wenn sie sich im Ordner \ bin befindet. Sie müssen die Assembly aus dem Ordner \ bin löschen und anschließend den Lauf & erneut ausführen.

0

Ich hatte auch ein ähnliches Problem (nicht die MS_attributerouteWebApi Route insbesondere, aber eine andere benannte Route). Nach der Überprüfung nur eine config.MapHttpAttributeRoutes() bestand, begann zu realisieren, dass MapHttpAttributeRoutes wird alle Projekt-Baugruppen einschließlich extern referenzierten registriert.Nach der Feststellung aus, dass ich eine referenzierte Assembly hatte, der seine eigene Routen wurde registriert, fand ich einen Weg Routen auszuschließen oder „überspringen“ durch die zwingende DefaultDirectRouteProvider:

/// <summary> 
/// Allows for exclusion from attribute routing of controllers based on name 
/// </summary> 
public class ExcludeByControllerNameRouteProvider : DefaultDirectRouteProvider { 

    private string _exclude; 
    /// <summary> 
    /// Pass in the string value that you want to exclude, matches on "ControllerType.FullName" and "ControllerType.BaseType.FullName" 
    /// </summary> 
    /// <param name="exclude"></param> 
    public ExcludeByControllerNameRouteProvider(string exclude) { 
     _exclude = exclude; 
    } 

    protected override IReadOnlyList<RouteEntry> GetActionDirectRoutes(
    HttpActionDescriptor actionDescriptor, 
    IReadOnlyList<IDirectRouteFactory> factories, 
    IInlineConstraintResolver constraintResolver) 
    { 
     var actionRoutes = new List<RouteEntry>(); 
     var currentController = actionDescriptor.ControllerDescriptor.ControllerType; 
     if (!currentController.FullName.Contains(_exclude) && !currentController.BaseType.FullName.Contains(_exclude)) 
     { 
      var result = base.GetActionDirectRoutes(actionDescriptor, factories, constraintResolver); 
      actionRoutes = new List<RouteEntry>(result); 
     } 
     return actionRoutes.AsReadOnly(); 
    } 
} 

Dies ermöglicht Ihnen einen Controller-Namen übergeben oder Typname Base in auszuschließen in Ihrem WebApiConfig.cs wie:

config.MapHttpAttributeRoutes(new ExcludeByControllerNameRouteProvider("Controller.Name")); 

Ob oder ob nicht in direktem Zusammenhang mit der Hoffnung, diese Schnipsel helfen können!

4

In der Global.asax überprüfen, wie oft WebApiConfig.Register Funktion aufgerufen wurde.

0

Wahrscheinlich haben Sie gleiche Register mehr als eins.

GlobalConfiguration.Configure(WebApiConfig.Register); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 

und schreiben dies diejenigen, anstatt sie:

GlobalConfiguration.Configuration.EnsureInitialized();

Versuchen unter Codes von Global.asax löschen BundleConfig.RegisterBundles (BundleTable.Bundles);

Ich bin nicht sicher über den Grund; aber es funktionierte für mich in meinem Fall.

Verwandte Themen