Keine HTTP-Ressource gefunden wurde, entspricht der request-URI-Fehler in ASP.NET Web-API
Dies ist eine Skizze von meinem TransferController Klasse.
Alle Web-API-code.
public class TransferController : ApiController
{
[HttpGet, ActionName("Queue")]
public IEnumerable<object> GetQueue(Guid sessionId) {...}
[HttpDelete, ActionName("Delete")]
public void Delete(Guid sessionId, Guid fileId) {...}
[HttpGet, ActionName("Cancel")]
public bool Cancel(Guid sessionId, Guid fileId) {...}
[HttpGet, ActionName("UploadedBytes")]
public long GetUploadedByteCount(Guid sessionId, Guid fileId) {...}
[HttpGet, ActionName("DownloadUrl")]
public string GetDownloadUrl(string fileId) {...}
[HttpPost, ActionName("FileChunk")]
public void PostFileChunk([FromUri]Guid sessionId, [FromUri]Guid fileId) {...}
[HttpPost, ActionName("UploadDefinition")]
public Guid PostUploadItem([FromBody]UploadDefinition uploadDef) {...}
}
Dies ist das routing.
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
config.Routes.MapHttpRoute(
name: "DefaultApiDefaultMethod",
routeTemplate: "api/{controller}"
);
}
Dies ist der Aufruf.
$.ajax({
url: "api/Transfer/Queue",
data: { sessiondId: login.SessionId() }
})
.done(function (result) {
history.push(new UploadItem());
for (var i = 0; i < result.length; i++) {
var ui = new UploadItem(result[i]);
history.push(ui);
}
})
.fail(function (result) {
app.showMessage(JSON.parse(result.responseText).Message);
});
Und das ist das Ergebnis.
No HTTP resource was found that matches the request URI 'http://localhost:54770/api/Transfer/Queue?sessiondId=0e2c47b9-e674-446d-a06c-ce16932f9580'.
Dies ist eine Skizze von meinem UserController Klasse.
public class UserController : ApiController
[HttpGet, ActionName("Authenticate")]
public object Authenticate(string email, string password) {...}
[HttpPost]
public void Register([FromBody]UserDefinition userDef) {...}
[HttpGet, ActionName("Pulse")]
public bool Pulse(Guid sessionId) {...}
}
Gründen unergründlich zu mir, ich habe keine Probleme Aufruf nichts in der UserController. Parameter werden umgewandelt in genau der gleichen Weise, und der gleichen Routen sind im Einsatz.
Darrel Miller unten verwendet unit-Tests zu validieren Routen. Ehrlich gesagt, ich bin kicking mich nicht daran zu denken, und jetzt habe ich das gleiche getan.
Aber tests zeigt er Ihnen wirklich testen, nur das Parsen der URL. Zum Beispiel, dieser test geht
public void TestMvc4RouteWibble()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var route =
config.Routes.GetRouteData(new HttpRequestMessage()
{
RequestUri = new Uri("http://localhost:54770/api/Transfer/Wibble?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580&fileId=0e2c47b9-e674-446d-a06c-ce16932f9581") //?
});
Assert.IsNotNull(route);
Assert.AreEqual("Transfer", route.Values["controller"]);
Assert.AreEqual("Wibble", route.Values["action"]);
}
trotz der offenkundigen Abwesenheit einer Methode Wibble auf den Transfer-controller.
Auch die route-Objekt ist nicht wirklich eine HttpRoute Objekt, es ist ein HttpRouteData Objekt. Aber das ist trivial korrigiert. Die HttpRoute Objekt ist als Eigenschaft des HttpRouteData Objekt.
public void TestMvc4RouteWibble()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var routeData =
config.Routes.GetRouteData(new HttpRequestMessage()
{
RequestUri = new Uri("http://localhost:54770/api/Transfer/Wibble?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580&fileId=0e2c47b9-e674-446d-a06c-ce16932f9581") //?
});
Assert.IsNotNull(routeData);
Assert.AreEqual("Transfer", routeData.Values["controller"]);
Assert.AreEqual("Wibble", routeData.Values["action"]);
}
Und es hat wiederum eine Handler-Eigenschaft. Dies ist jedoch weniger informativ als es sein könnte, da ein null-handler bedeutet einfach (aus MSDN)
Wenn null, wird der Standard-handler sendet Nachrichten an Implementierungen von IHttpController.
Nun, mein controller ist abgeleitet von ApiController die sicherlich implementiert die ExecuteAsync-Methode, dass ist das einzige, was angegeben wird durch die IHttpController-Schnittstelle. Was ich mir vorstellen heißt, ich könnte Testausführung der Methode, wenn ich wüßte mehr darüber.
Cancel
nicht alle Maßnahmen sollten zurück ActionResult ? ich m nicht bewusst Apicontroller aber im Controller müssen Sie den Rückgabetyp Actionresult oder abgeleiteten Typ...
Dies ist das Web-API. Dies sollte offensichtlich sein, von der Tatsache, dass die Klasse erbt von ApiController, aber ich nenne es in der Frage der richtigen.
Wird jemals jemand nach "ASP.NET WEB-API-Routing-Rätsel?" Der Titel sollte etwas sein, was jemand suchen würde. Im Gegensatz zu einem forum, der Titel sollte hier die Beschreibung Ihres Problems.
InformationsquelleAutor Peter Wone | 2014-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein test, der zeigt, das routing funktioniert ok,
und hier ist ein test mit dem Versand/Aktion Auswahl ist auch arbeiten,
Das alles verändert die Guids Zeichenketten und analysiert Sie innerhalb der Methode. Keine Auswirkung auf das problem, die ist (glaube ich) ein routing Fehler.
Ich weiß nicht, warum ich immer die Fehler vor, aber jetzt es funktioniert gut für mich... Sehr verwirrt.
Das Ding, das gab ärger und nun gut funktioniert, meinst du Guid-Parameter?
Ja.
InformationsquelleAutor Darrel Miller
OK dann... vielen Dank für die Umsetzung der unit-test-Idee in meinem Kopf, es beschleunigt die Dinge ungemein.
Hier die Fakten:
Können Sie haben identische parameter-Signaturen für verschiedene Verben (get post put delete).
Du nicht haben identische parameter-Signaturen auf verschiedenen action-Namen auf dem gleichen verb.
Brauchen Sie nur variieren eine parameter name.
Also das ist ok, weil Sie alle auf verschiedene Verben
aber das ist nicht cool, denn Sie sind beide bekommt
und Sie können es zu beheben, wie dies
Vielleicht bin ich ein hard-ass, aber soweit ich betroffen bin, es ist nicht das routing, bis die Methode aufgerufen wird.
InformationsquelleAutor Peter Wone