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 .
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.
Prüfen Sie in der Global.asax , wie oft WebApiConfig.Register
aufgerufen wurde.
Gelöst! Die Zeile WebApiConfig.Register(GlobalConfiguration.Configuration);
wurde aus Global.asax.cs Application_Start
entfernt.
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.
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.
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 }
);
}
}
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.
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.
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!
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.