wake-up-neo.net

Eine Route mit dem Namen 'MS_attributerouteWebApi' ist bereits in der Routensammlung enthalten

Ich habe kürzlich Microsoft.AspNet.WebApi.WebHost zu einem MVC-WebAPI-Projekt hinzugefügt, wodurch ich das [Route("api/some-action")]-Attribut für meine Aktion verwenden könnte. Ich habe einige Fehler mit diesem Artikel behoben, kann aber den dritten Fehler nicht beheben. Im Folgenden wurden gelöste Fehler hinzugefügt, um Feedback zu erhalten, falls ich etwas falsch gemacht habe.

Erster Fehler: Auf dem Controller 'X' wurde keine Aktion gefunden, die mit dem Namen 'some-action' .__ übereinstimmt.
Solution: config.MapHttpAttributeRoutes(); wurde der WebApiConfig.cs Register-Methode hinzugefügt.

Second Error: System.InvalidOperationException Das Objekt wurde noch nicht initialisiert. Stellen Sie sicher, dass HttpConfiguration.EnsureInitialized () im Startcode der Anwendung nach allen anderen Initialisierungscodes ..__ aufgerufen wird.
Lösung: GlobalConfiguration.Configure(WebApiConfig.Register); zu Global.asax.cs hinzugefügt Application_Start

Dritter Fehler: System.ArgumentException: Eine Route mit dem Namen 'MS_attributerouteWebApi' befindet sich bereits in der Routensammlung. Routennamen müssen eindeutig sein .
Lösung =?

Ich habe bereits versucht, alle DLLs aus dem bin-Ordner zu löschen und zu löschen, und zwar nach diesem Beitrag .

17
joym8

Ich hatte ein ähnliches Problem und es lag im Zusammenhang mit einem Fehler beim Einfügen von Kopien, bei dem ich eine Kopie dieser Zeile in meine Datei WebApiConfig.cs eingefügt habe:

config.MapHttpAttributeRoutes ();

stellen Sie sicher, dass Sie nur eine davon haben.

31
BraveNewMath

Prüfen Sie in der Global.asax , wie oft WebApiConfig.Register aufgerufen wurde. 

10
JoeyZhao

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

6
joym8

Ich habe das Bereinigen des Bereitstellungsverzeichnisses gelöst, bevor Sie die neuen Dateien kopieren. Wahrscheinlich gab es eine alte Datei, die den gleichen Stamm mehrmals registrieren wollte.

5
Davide Icardi

Für alle, die wie ich darüber stolpern, tritt dieser Fehler auf, wenn Sie den Assemblynamen (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 kann).

Da sich der Assemblyname unterscheidet, werden bei einer Bereinigung oder Neuerstellung die "alte" Assembly nicht entfernt, wenn sie sich im Ordner\bin befindet. Sie müssen die Assembly aus dem Ordner\bin löschen und anschließend neu erstellen und ausführen.

2
VictorySaber

Ich hatte das gleiche Problem und stellte fest, dass in WebApiConfig.cs und nachdem ich die Konfiguration für die API-Version hinzugefügt hatte

Ich habe diese beiden Zeilen

config.MapHttpAttributeRoutes(constraintResolver);

config.MapHttpAttributeRoutes();

Ich habe die zweite Zeile entfernt

der endgültige Code ist

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        // Web API routes
        var constraintResolver = new DefaultInlineConstraintResolver()
        {
            ConstraintMap =
            {
                ["apiVersion"] = typeof( ApiVersionRouteConstraint )
            }
        };
        config.MapHttpAttributeRoutes(constraintResolver);
        config.AddApiVersioning();

        // Web API configuration and services

        // Web API routes
       // config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );


    }
}
1
Mohamed Salah

Wahrscheinlich haben Sie mehr als eine Registrierung.

Versuchen Sie, die folgenden Codes aus Global.asax zu löschen:

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

und schreibe diese anstelle von ihnen:

GlobalConfiguration.Configuration.EnsureInitialized (); BundleConfig.RegisterBundles (BundleTable.Bundles); 

Ich bin nicht sicher über die Vernunft. aber in meinem Fall funktionierte es für mich.

1
nzrytmn

In meinem Fall war der Fehler: "Eine Route mit dem Namen 'MS_attributerouteWebApi' befindet sich bereits in der Routensammlung. Routennamen müssen eindeutig sein. Parametername: Name"

Code war:

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            config.MapHttpAttributeRoutes();  // this line had issue

            var constraintResolver = new DefaultInlineConstraintResolver();
            constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));
            config.MapHttpAttributeRoutes(constraintResolver);

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

Lösung: Ich habe gerade die Zeile - config.MapHttpAttributeRoutes(); von der obigen Methode entfernt und sie wurde aufgelöst.

0
Sagar Pandit

Ich hatte auch ein ähnliches Problem (nicht insbesondere die MS_attributerouteWebApi-Route, sondern eine andere benannte Route). Nachdem festgestellt wurde, dass nur eine config.MapHttpAttributeRoutes() vorhanden war, wurde klar, dass MapHttpAttributeRoutes alle Projektassemblierungen registrieren wird, einschließlich extern referenzierter. Nachdem ich herausgefunden hatte, dass ich über eine referenzierte Assembly verfügte, die ihre eigenen Routen registrierte, fand ich einen Weg, um Routen auszuschließen oder zu "überspringen", indem die DefaultDirectRouteProvider überschrieben wurde:

/// <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();
    }
}

Dadurch können Sie einen Controllernamen oder einen Basistypnamen angeben, um diesen in Ihrem WebApiConfig.cs auszuschließen:

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

Ob direkt verwandt oder nicht, in der Hoffnung, dass dieses Snippet hilfreich sein kann!

0
vandsh

Ich hatte das gleiche Problem. Die Lösung, die ich fand, war, dass ich für Mono eine visuelle Basisunterstützung benötigte. Als ich "yum install mono-basic" ausführte und meinen Computer neu startete, verschwand der Fehler.

0
DonM