2017-10-11 16 views
0

J'ai créé un WEB API en utilisant la base de données MySQL. L'API fonctionne comme prévu pour le moment. J'ai envoyé un numéro de série de compteur et un paramètre de date et heure puis obtenir le résultat attendu. Ci-dessous mon contrôleurTransmission de plusieurs paramètres à l'API Web Méthode GET

public MDCEntities medEntitites = new MDCEntities(); 
public HttpResponseMessage GetByMsn(string msn, DateTime dt) 
    {   
     try 
     { 
      var before = dt.AddMinutes(-5); 
      var after = dt.AddMinutes(5); 

      var result = medEntitites.tj_xhqd 
         .Where(m => 
         m.zdjh == msn && 
         m.sjsj >= before && 
         m.sjsj <= after).Select(m => new { MSN = m.zdjh, DateTime = m.sjsj, Signal_Strength = m.xhqd }).Distinct(); 


      return Request.CreateResponse(HttpStatusCode.Found, result); 
     } 
     catch (Exception ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex); 
     } 
    } 

ci-dessous est mon fichier WebApiConfig

config.Routes.MapHttpRoute(
     name: "GetByMsn", 
     routeTemplate: "api/{controller}/{action}/{msn}/{dt}", 
     defaults: null, 
     constraints: new { msn = @"^[0-9]+$" , dt = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$" } 
     ); 

L'URL est http://localhost:14909/api/meters/GetByMsn/002999000171/2017-10-10T10:08:20

La réponse que je reçois est

[{ 
    "MSN": "002999000171", 
    "DateTime": "2017-10-10T10:04:39", 
    "Signal_Strength": "20" 
}, 
{ 
    "MSN": "002999000171", 
    "DateTime": "2017-10-10T10:06:35", 
    "Signal_Strength": "19" 
}, 
{ 
    "MSN": "002999000171", 
    "DateTime": "2017-10-10T10:08:31", 
    "Signal_Strength": "20" 
}, 
{ 
    "MSN": "002999000171", 
    "DateTime": "2017-10-10T10:10:27", 
    "Signal_Strength": "20" 
}, 
{ 
    "MSN": "002999000171", 
    "DateTime": "2017-10-10T10:12:23", 
    "Signal_Strength": "20" 
}] 

Tout cela scénario fonctionne lorsqu'un single serial number est passé. Mais du côté client, il y aurait plus d'un numéro de série différent. Pour cela, j'ai dû faire en sorte que ma méthode fonctionne à la fois pour un et plusieurs numéros de série à condition que la date et l'heure soient les mêmes pour tous.

One solution is to create a new method a pass the multiple serial number strings, but this will not help because the number of serial numbers are dynamic i.e. they may be one, two to 100's. So setting a hard coded method won't be a solution. 

Je l'ai recherché mais la plupart du temps j'ai trouvé la méthode statique encore et encore. Mais ce solution semble un peu utile mais encore une fois je ne sais pas si cela va fonctionner ou non.

Toute aide serait grandement appréciée.

Répondre

0

Vous pouvez passer un modèle personnalisé à une méthode d'action, mais je suggère de ne pas utiliser le GET pour votre tâche car GET n'a pas de corps.

Au lieu de cela, utilisez le verbe SEARCH et mettez la liste des numéros de série et la date dans un modèle personnalisé dans le corps.

public class MeterSearchModel 
{ 
    public List<string> Serials {get;set;} 
    public DateTime Date {get;set;} 
} 

Dans Core 2 .NET votre contrôleur aurait quelque chose comme -

[AcceptVerbs("SEARCH")] 
public async Task<IActionResult> Search([FromBody] MeterSearchModel model) 
{ 
    //..perform search 
}