9

Ich benutze asp.net mvc 5 und web api 2. Für das asp.net mvc 5 projekt habe ich alles funktionierend ... aber neu ich versuche web api 2 routen hinzuzufügen ... wenn ich Bereiche benutze.web api 2 bereich routen

Ich habe die Web-api 2-Controller auf der Projektstammarbeits:

//this is working 
    namespace EtracsWeb.Controllers 
    { 
     public class TestController : ApiController 
     { 
      //localhost:port/api/test ...this is working 
      [HttpGet] 
      public HttpResponseMessage Get() 
      { 

       return new HttpResponseMessage() 
       { 
        Content = new StringContent("GET: Test message") 
       }; 
      } 

     } 
    } 

So meine ich gehe davon aus Global.asax, mein routeconfig.cs und meine webapiconfig.cs korrekt sind ... (nicht dargestellt) ...

Aber jetzt arbeitet ich versuche, den Web-api 2 in meinem Gebiet zu bringen ...

ich habe alles gelesen ich im Internet finden konnte, und dies scheint wie soll es Arbeit:

namespace EtracsWeb.Areas.WorkOrder 
{ 
    public class WorkOrderAreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get 
      { 
       return "WorkOrder"; 
      } 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 

      context.Routes.MapHttpRoute(
        name: "AuditModel_Api", 
        routeTemplate: "WorkOrder/api/AuditModelApi/{id}", 
        defaults: new { id = RouteParameter.Optional } 
       ); 

     //default 
      context.Routes.MapHttpRoute(
        name: "WorkOrder_Api", 
        routeTemplate: "WorkOrder/api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional } 
       ); 

      context.MapRoute(
       "WorkOrder_default", 
       "WorkOrder/{controller}/{action}/{id}", 
       new { action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 

Mein Controller-Code ist:

namespace EtracsWeb.Areas.WorkOrder.ApiControllers 
{ 
    public class AuditModelApiController : ApiController 
    { 
     IManufacturerStopOrderModelService auditModelService = new WorkOrder.Services.VWAuditModelService(UserSession.EtracsUserID, UserSession.ProgramID, UserSession.EtracsSessionID, UserSession.ConnectionString); 

     [HttpGet] 
     [Route("AuditModelApi")] 
     public HttpResponseMessage Get() 
     { 

      return new HttpResponseMessage() 
      { 
       Content = new StringContent("GET: Test message") 
      }; 
     } 

     [Route("AuditModelApi/AuditModels")] 
     public IEnumerable<VwAuditModel1> GetAuditModels() 
     { 
       return auditModelService.GetModels(); 
     } 

     public IHttpActionResult UpdateAuditMode() 
     { 
      //example of what can be returned ... NotFound, Ok ... look into uses... 

      VwAuditModel1 result = new VwAuditModel1(); 
      return Ok(result); 

      return NotFound(); 
     } 
    } 
} 

habe ich versucht, den Controller mit und ohne das Attribut Name [Route] ... und ich kann nicht entweder an der Arbeit ...

Sowohl der einfache Fall

public HttpResponseMessage Get() 

und der "echte" Fall

public IEnumerable<VwAuditModel1> GetAuditModels() 

geben das gleiche Ergebnis zurück. Aus dem Browser, mit

http://localhost:64167/WorkOrder/api/AuditModelApi 

und

http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels 

ich folgenden erhalten:

<Error> 
<Message> 
No HTTP resource was found that matches the request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels'. 
</Message> 
<MessageDetail> 
No route providing a controller name was found to match request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels' 
</MessageDetail> 
</Error> 
+0

fügen Sie webapiconfig.cs codeto ur post hinzu. Das ist, wo du fehlst, um Attributwege zu registrieren, nehme ich an. –

Antwort

2

Sie benötigen die HttpConfiguration Instanz aus dem GlobalConfiguration Objekt und rufen Sie die MapHttpAttributeRoutes() Methode aus dem Innern der RegisterArea() Methode der AreaRegistration.cs zu bekommen.

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 

     //... omitted code 
    } 

Schließlich müssen Sie in der WebApiConfig entfernen config.MapHttpAttributes() Methode oder werden Sie doppelte Ausnahme erhalten.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.EnableCors(); 

     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 


     // Web API routes 
     //config.MapHttpAttributeRoutes(); 

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

Es sieht so aus [sollte stattdessen sein] (http://stackoverflow.com/a/19882528/712526) 'GlobalConfiguration.Configure (x => x.MapHttpAttributeRoutes())' wie Web Api v2 . – jpaugh

3

Das Problem mit diesem speziellen API-Aufruf ist, dass Sie nicht einen Controller zu verwenden, in angegeben haben deine Route.

 context.Routes.MapHttpRoute(
       name: "AuditModel_Api", 
       routeTemplate: "WorkOrder/api/AuditModelApi/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

sein sollte

 context.Routes.MapHttpRoute(
       name: "AuditModel_Api", 
       routeTemplate: "WorkOrder/api/AuditModelApi/{id}", 
       defaults: new { controller = "AuditModelApi", id = RouteParameter.Optional } 
      ); 

Constant Segmente in der URL zu spezifizieren, welche URL übereinstimmen, aber Sie müssen es immer noch sagen, was die Route Werte sind, um es an die Steuerung zu erhalten und Aktion. Es gibt keine Möglichkeit zu wissen, welches Segment als Controller-Name verwendet werden soll, es sei denn, Sie machen es zu einem {controller} Segment.

+0

Das funktioniert ... Danke ... aber das bindet den Bereich an einen einzigen Controller. Was machen wir, wenn es mehr als einen Controller gibt? – user2040850

+0

In diesem Fall würden Sie das Argument routeTemplate mit einem Controller-Platzhalter angeben: 'WorkOrder/api/{controller}/{id)'. – NightOwl888

+0

I der ursprüngliche Code für die Registrierung Ich hatte bereits versucht, eine Variation dieser ... NICHT Angabe der Controller und Verwendung der Route, die Sie gab .. und es gab einen Fehler, dass es die Ressource nicht finden konnte (wieder sehen Sie die ursprüngliche Nachricht) ... Ich dachte, das war richtig ... habe ich etwas falsch die mapphttproute Aussage? – user2040850

3

Zunächst sollten Sie die Route mit der Umgebung registrieren sie gehört, dass nur dann Sinn macht, so in Ihrem AreaNameAreaRegistration Klasse sicher sein, hinzuzufügen using System.Web.Http so erhalten Sie die Erweiterungsmethode MapHttpRoute, es ist nicht Teil System.Web.Mvc.

Die Reihenfolge oben ist ein bisschen aus, was die 404 verursacht.Fügen Sie die folgende Route:

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

Wenn Sie Lust und fügen Sie den Bereichsnamen aus der Eigenschaft AreaName erhalten möchten (natürlich Sie kümmern uns um gute Programmierpraktiken;)):

context.Routes.MapHttpRoute(
      name: "AreaNameWebApi", 
      routeTemplate: string.Concat("api/", AreaName, "/{controller}/{id}"), 
      defaults: new { id = RouteParameter.Optional } 
     ); 

Dies wird korrigieren das Problem 404. Im Web-API-Modul wird standardmäßig nach "api" gesucht, um zu bestimmen, wo nach dem Controller gesucht wird (andernfalls wird es verwirrt, es ist keine Magie), daher muss api beim Anfügen des Bereichsnamens und Controllers zuerst an erster Stelle stehen. Natürlich können Sie diese Reihenfolge ändern, indem Sie Ihre Routen hart codieren, aber ich empfehle das nicht, da Sie jede Route und jeden Controller in der Routenkonfiguration angeben oder die RouteAttribute verwenden müssen.

Plus, mit "api" zuerst wird es eine nette Standard-URL für Sie und Ihre Benutzer statt API überall zu machen. Hier sind einige Beispiele:

http://site/api/members/myAccount/update 
http://site/api/members/myAccount/get/12345 
http://site/api/members/contacts/getByOwnerId/12345 

Hoffe, das hilft!

Zev