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.

Ich möchte vermeiden, wird für 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

Schreibe einen Kommentar