2017-10-21 50 views
0

J'ai un contrôleur web api et jusqu'ici il n'y avait qu'une action et tout fonctionnait correctement. J'ai essayé d'ajouter une deuxième action et je n'arrive pas à la rendre accessible.Avoir plus d'une action dans un contrôleur webapi

Voici la signature de la méthode et snip du corps de la méthode pour l'action de travail:

[Route("data/add")] 
[HttpPost] 
public HttpResponseMessage Add(Message item) 
{ 
    using(var ctx = new dbContext()) 
    { 
     // add new message using EF. snip 
    } 
} 

Ma signature de la méthode et snip du corps de la méthode pour l'action que j'ai des problèmes avec est:

[Route("data/check")] 
[HttpPost] 
public HttpResponseMessage Check(DateTime date) 
{ 
    using (var ctx = new dbContext()) 
    { 
     // check if any messages after param date 
     // snip 
    } 
} 

Et voici ma config itinéraire.

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

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

La chose drôle est mon autre action, celui qui travaille, peut être consulté via

données/ajouter

qui semble contredire le routage .

Edit: Le message que je reviens de Postman est

Aucune ressource HTTP a été trouvé qui correspond à la demande URI 'http://localhost:62243/data/check'

+0

Quelle version d'Asp.Net utilisez-vous? – Nikolaus

+0

v4.0.30319 @Nikolaus – andrewb

+0

Avez-vous aussi un attribut route sur votre contrôleur? – Nikolaus

Répondre

0

Essayez de changer le routage à la routage et routage par défaut uniquement via des attributs de ce type:

//Add this to your Controller 
[RoutePrefix("api/{controller}")] 
public class YourController:ApiController 
{ 
    //Whatever code 

    // Only part-route necessary. 
    [Route("add")] 
    [HttpPost] 
    public HttpResponseMessage Add(Message item) 
    { 
     using(var ctx = new dbContext()) 
     { 
      // add new message using EF. snip 
     } 
    } 

    // Like before 
    [Route("check")] 
    [HttpPost] 
    public HttpResponseMessage Check(DateTime date) 
    { 
     using (var ctx = new dbContext()) 
     { 
      // check if any messages after param date 
      // snip 
     } 
    } 

} 
+0

Pourquoi avez-vous défini un préfixe de route pour la méthode Add, et non le contrôle? – andrewb

+0

Je ne comprends pas: J'ai un RoutePrefix pour le Controller et un RouteAttribute pour les deux méthodes. – Nikolaus

+0

@andrewb Avez-vous réussi à résoudre votre problème? – Nikolaus