Ich habe eine asp.net Web Forms-Anwendung, die im integrierten Modus v4.0 ausgeführt wird.
Ich habe versucht, einen Apicontroller im Ordner App_Code hinzuzufügen.
In der Global.asax habe ich den folgenden Code hinzugefügt
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Wenn ich versuchte, unter http://localhost/api/Value
zum Controller zu navigieren, erhalte ich den Fehler 404.
Die extensionless-URL wird im Handler-Abschnitt konfiguriert. Ich habe Formulare und anonyme Authentifizierung für die Website aktiviert.
ExtensionLess-URL ist für '*' konfiguriert.
Wenn ich die URL für den Controller drücke, wird die Anforderung von StaticHandler statt von ExtensionlessUrlHandler-Integrated-4.0 verarbeitet.
Ich habe jetzt keine Ahnung, warum das System den Fehler auslöst, wie in der Abbildung unten gezeigt.
Ich hatte dieses Problem.
Ich habe versucht, meinen WebApiConfig.cs
zu bearbeiten, um eine Reihe von Empfehlungen zu erfüllen und an anderen Stellen Code-Beispiele zu verwenden. Einige funktionierten, aber es erklärte nicht, warum die Route nicht funktionierte, wenn WebApiConfig.cs
genau gemäß dem MS-Template-WebApi-Projekt codiert wurde.
Mein eigentliches Problem bestand darin, dass ich beim manuellen Hinzufügen von WebApi
zu meinem Projekt die Reihenfolge der Konfigurationsaufrufe von Global.asax
nicht beachtet hatte.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// This is where it "should" be
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// The WebApi routes cannot be initialized here.
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Ich könnte raten, warum dies so ist, aber ich habe nicht weiter nachgeforscht. Es war nicht intuitiv, um es gelinde auszudrücken.
Das Problem liegt in Ihrer Routing-Konfiguration. Mvc
routing unterscheidet sich von WebApi
routing.
Fügen Sie einen Verweis auf System.Web.Http.dll
, System.Web.Http.Webhost.dll
und System.Net.Http.dll
hinzu und konfigurieren Sie dann Ihr API-Routing wie folgt:
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Stellen Sie die folgenden Dinge sicher
1.) Stellen Sie sicher, dass Ihre IIS mit .NET 4.5 oder 4.0 konfiguriert ist, wenn Ihre Web-API 4.5 ist. Installieren Sie 4.5 in IIS.
führen Sie diesen Befehl in der Eingabeaufforderung mit Administratorrechten aus
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i
2.) Ändern Sie Ihren Arbeitsplan in
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
und machen Sie eine Anfrage mit Demo/Get (wobei Demo Ihr Controller-Name ist)
wenn die 1,2 nicht funktionieren versuchen sie 3
3.) Fügen Sie die folgende Konfiguration in die Datei web.config ein
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
Stellen Sie außerdem sicher, dass Ihr Controller mit dem Namen "Controller" wie in "PizzaPieController" endet.
Ich habe alles ausprobiert und hatte das gleiche Problem. Es stellte sich heraus, dass der in IIS erstellte App-Pool auf .net 2.0 eingestellt war. Als ich es auf 4.0 änderte, funktionierte es wieder
Wenn Sie den Controller in App_Code erstellen, woher weiß die Routingtabelle, wo sie sich befindet? Sie haben die Route als "api/{controller/..." angegeben, aber dort befindet sich der Controller nicht. Verschieben Sie es in den richtigen Ordner.
Danke Shannon, funktioniert super =>
Meine Bestellung in meiner Global.asax war:
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
anstelle des Guten:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
Nachdem ich stundenlang Zeit damit verbracht hatte, fand ich in meinem Fall die Lösung dafür.
Es war die Reihenfolge der Registrierung der Routen in RouteConfig.
Wir sollten die HttpRoute in der Routentabelle vor der Default Controller Route registrieren. Es sollte wie folgt sein. Route Config Routentabelle konfigurieren
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Versuchen Sie auch, den gesamten Inhalt des Ordners api bin zu löschen. Meine enthielt alte DLLs (wegen der Umbenennung großer Namespaces), die in Konflikt stehende Controller enthüllten. Diese DLL-Dateien wurden von der Clean-Funktionalität von Visual Studio nicht gelöscht.
(Allerdings finde ich, dass asp.net web api auf der Debug-Ebene ernsthaft Routing- und Debugging-Informationen hat).
Vergewissern Sie sich, dass es sich bei der von Ihnen verwendeten URL (http://localhost/api/Value
) um einen öffentlichen Typ mit dem Namen ValueController
handelt, der von ApiController
abgeleitet ist und über eine öffentliche Methode mit folgenden Eigenschaften verfügt:
Get
(z. B. GetValues
oder einfach Get
).HttpGet
-Attribut angewendet.Falls Sie den Code aus der Standard-Web-API-Projektvorlage versuchen, lautet der Name des Controllers ValuesController
und nicht ValueController
. Die URL lautet http://localhost/api/values
.
Wenn keine der oben genannten Maßnahmen hilfreich ist, möchten Sie möglicherweise die Ablaufverfolgung aktivieren , die Ihnen nützliche Informationen darüber gibt, wo in der Pipeline der Fehler auftritt (und warum).
Hoffe das hilft.
Ich habe eine RouteAttribute
-basierte Controller-DLL in den Bin-Ordner kopiert, aber sie wurde nicht als gültiger Controller erkannt und der 404-Fehler wurde auf dem Client angezeigt.
Nach vielem Debuggen fand ich mein Problem. Die Version von System.Web.Http.dll
, auf die der Controller referenzierte, unterschied sich von der Version von System.Web.Http.dll
, sodass das Hauptprojekt (das Projekt, das global.asax.cs enthält) referenzierte.
Asp.Net findet den Controller durch Reflexion mit einem solchen Code
internal static bool IsControllerType(Type t)
{
return
t != null &&
t.IsClass &&
t.IsVisible &&
!t.IsAbstract &&
typeof(IHttpController).IsAssignableFrom(t) &&
HasValidControllerName(t);
}
Da IHttpController
für jede Version von System.Web.Http.dll
unterschiedlich ist, müssen Controller und Hauptprojekt dieselbe Referenz haben.
Wir hatten auch das, indem wir die .NET-Version von 4.5 auf 4.5.1 änderten oder neuere Probleme lösten
Versuchen Sie es einfach mit dem Value
-Teil des Controller-Namens wie folgt:
http://localhost/api/Value
Hinweis: Die Routing-Engine nimmt standardmäßig einen als Controller-Namen übergebenen Wert an und fügt das Wort
Controller
hinzu. Durch das Einfügen vonValueController
in den URI musste das Routingmodul nach einer Klasse mit dem NamenValueControllerController
suchen, die nicht gefunden wurde.
Es ist Zeit für mich, mein albernes Versehen in die Liste aufzunehmen: Ich habe meinen Webapi-Standardroutenpfad falsch geschrieben.
Original:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/id",
defaults: new { id = RouteParameter.Optional}
);
Fixed: (beobachte die geschweiften Klammern um "id")
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional}
);
Ihre Routenkonfiguration sieht gut aus. Überprüfen Sie den Handlers-Abschnitt in web.config noch einmal. Für den integrierten Modus ist dies der richtige Weg, um ExtensionLessUrlHandler zu verwenden:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Mehr zum Thema: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4. aspx
In meinem Fall habe ich vergessen, es von ApiController ableiten zu lassen.
So würde es aussehen
public class ValuesController : ApiController
Keine der obigen Lösungen löste mein Problem ... Mein Fehler war, dass ich die bin-Dateien direkt auf den Produktionsserver kopiert habe und dann nicht mehr funktioniert. Der 404 war verschwunden, als ich das Projekt auf der Festplatte veröffentlichte, und den "veröffentlichten" Ordner auf den Server kopiert. Es ist ein wenig offensichtlich, kann aber jemandem helfen.
Ich schätze, dass dies eine sehr alte Frage ist, aber ich dachte, ich würde eine weitere Antwort für zukünftige Benutzer hinzufügen.
Ich fand das gerade in einem Projekt, an dem ich gerade arbeitete, nachdem es für CI/Staging bereitgestellt wurde. Die Lösung bestand darin, den Kompilierungswert debug = "true" hin und her zu schalten, während jede Version einmal für jede Umgebung bereitgestellt wurde.