2

Ich kann wirklich nicht verstehen, warum es nicht funktioniert. Ich habe den folgenden Code:ASP.NET Web Api 2 Routing-Problem

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

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

[RoutePrefix("api/Profile")] 
[System.Web.Http.AuthorizeAttribute] 
[IdentityBasicAuthenticationAttribute] 
public class ProfileApiController : ApiController 
{ 
    [HttpPost] 
    [ValidateApiContentLength] 
    [ValidateApiMimeMultipart] 
    [Route("Upload")] 
    public async Task<HttpResponseMessage> UploadDocumentAsync(string description) 
    { 
     //.... 
    } 
} 

}

aber wenn ich rufe: http://localhost:11015/api/profile/Upload

ich Fehler 404:

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:11015/api/profile/Upload'.", 
    "MessageDetail": "No action was found on the controller 'ProfileApi' that matches the request." 
} 

aber Einsicht sagt über Fehler:

enter image description here

Was ist falsch?

+0

1. Wie haben Sie den Anruf gemacht? 2. Welche Vorlage verwenden Sie für das Projekt: asp mvc oder asp mvc web api? – CodingYoshi

Antwort

0

Ich habe eine Lösung gefunden. Problem war nicht im Routing. Problem war im Parameter der Aktion. Es sollte nicht für die POST-Methode da sein. Andere Dinge gehen wie

[HttpPost] 
    [ValidateApiContentLength] 
    [ValidateApiMimeMultipart] 
    [Route("upload")] 
    public async Task<HttpResponseMessage> UploadDocumentAsync() 
    { 
0

WebApi Routing kann Ihre UploadDocumentAsync Methode nicht finden. In Ihrer Anwendung verwenden Sie sowohl die Routing-Tabelle (in der WebApiConfig-Klasse) als auch das Attribut-Routing. Sie brauchen Letzteres nicht.

Sie können die Routing-Tabelle in der WebApiConfig Klasse lassen wie es ist und legen Sie die Strecke und RoutePrefix Attribute.

Ändern Sie Ihre Aktion UploadDocumentAsync im Profil-Controller:

... 
[HttpPost] 
public async Task<HttpResponseMessage> UploadUploadDocumentAsync(string description) 
{ 
... 

so dass nur die Httppost Attribut.

können Sie Ihre Ressource erreichen unter der Rufnummer (man kann es über Fiddler tun, für exampe):

POST http://localhost:11015/api/profile/

UPDATE:

Oder wenn Sie würde wirklich gerne haben die " upload“Teil in Ihrer uRL, Sie können nutzen, um die Strecke Attribut für die Aktion:

[Route("api/profile/upload")] 
+0

Erstens: Das OP möchte das Attribut-Routing verwenden und fragt, warum das Attribut-Routing nicht funktioniert. Daher schlagen Sie vor, das Attribut-Routing nicht zu verwenden, um die Frage nicht zu beantworten. Zweitens: '[Route (" api/profile/upload ")] ändert auch die Art, wie das OP das Routing entworfen hat. Daher schlagen beide Vorschläge vor ändere das Design und beantworte die Frage nicht. – CodingYoshi

+0

Erstens: OP fragte nicht genau * Attribut * Routing, vielleicht Tabellenrouting wird ausreichen. Zweitens: api/profile/upload erlaubt es ihm, eine URL wie: http (s): // {host}/api/profile/upload zu verwenden, was OP will. –

+0

@CodingYoshi, nachdem ich die Frage am Morgen noch einmal gelesen habe, denke ich, dass es eine Möglichkeit gibt, dass Sie recht haben könnten. OlegSh, wenn das der Fall ist, lass es uns bitte. –