2

Я создал новое действие web api и добавил для него новую маршрутизацию. Я не уверен, что я сделал это право, скорее всего, нет, поэтому я получаю эту ошибку.web api 2 возвращающая ошибка

Так я добавил мой метод/Действие как этот

public IQueryable<Devices> GetLatestDevice(DateTime? latestUpdate) 
    { 
     return db.devices.Where(dev => dev.UpdatedDate > latestUpdate); ; 
    } 

и это мой стол

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     //routes.IgnoreRoute(""); 
     routes.MapRoute(
      name: "Device", 
      url: "{controller}/{action}/{lastUpdate}", 
      defaults: new { controller = "Home", action = "Index", lastUpdate = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

маршрутизации и это, как я пытаюсь получить данные:

http://localhost:53658/api/DevicesAPI/21-01-2001 

    <Error><Message>An error has occurred.</Message><ExceptionMessage>Multiple actions were found that match the request: 
GetLatestDevice on type WhitespiderMonitor.Controllers.DevicesAPIController 
GetDevices on type WhitespiderMonitor.Controllers.DevicesAPIController</ExceptionMessage><ExceptionType>System.InvalidOperationException</ExceptionType><StackTrace> at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 
    at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) 
    at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()</StackTrace></Error> 

Мои догадки связаны с тем, что маршруты в значительной степени одинаковы, и они не могут отличить их, поэтому мои вопросы действительно я исправлю, что они такие же, и как я получу его, чтобы он подбирал дату. Дополнительная информация может быть предоставлена ​​при необходимости, спасибо! не

Я не обновил таблицу маршрутов для

routes.MapRoute(
      name: "Device", 
      url: "DevicesAPI/GetLatestDevice/{lastUpdate}", 
      defaults: new { lastUpdate = UrlParameter.Optional } 
     ); 

и теперь получаю эту ошибку:

<Error><Message>The request is invalid.</Message><MessageDetail>The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int64' for method 'System.Web.Http.IHttpActionResult GetDevices(Int64)' in 'WhitespiderMonitor.Controllers.DevicesAPIController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.</MessageDetail></Error> 
+0

Ваш оба маршрута являются общими и соответствуют одному и тому же запросу. Просто введите код контроллера и название действия. e..g замените этот url: "{controller}/{action}/{lastUpdate}", с url: "Device/GetLatestDevice/{lastUpdate}" –

+0

Так что я должен удалить только что созданный маршрут и просто использовать жестко закодированные URL? – Johnathon64

+0

не заменяет первое значение URL маршрута. Должен быть один маршрут с динамическим контроллером и именем действия, чтобы другие функции не влияли. –

ответ

0

замените метод действия с ниже код.

public IQueryable<Devices> GetLatestDevice(DateTime latestUpdate) 
    { 
     return db.devices.Where(dev => dev.UpdatedDate > latestUpdate); 
    } 

И добавьте ниже код маршрутизации в WebAPIConfig.cs перед существующим по умолчанию кодом маршрутизации.

 Routes.MapHttpRoute(
     name: "CustomApi", 
     routeTemplate:"api/{controller}/{action}/{latestUpdate:DateTime?}", 
     defaults: new { controller:"DevicesAPI",latestUpdate = RouteParameter.Optional } 
      ); 
0

У вас есть две общие маршруты. Вы можете изменить один во что-то вроде:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    //routes.IgnoreRoute(""); 
    routes.MapRoute(
     name: "Device", 
     url: "device/{action}/{lastUpdate}", 
     defaults: new { controller = "Device", action = "Index", lastUpdate = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 

Так специфична будет удар при использовании Device контроллера.

0

Другим решением было бы добавить параметр action в коде маршрутизации, как:

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

Вам нужно передать имя action в вашем URL, как следующие:

http://localhost:53658/api/DevicesAPI/{your action name}/21-01-2001 

enter image description here enter image description here enter image description here enter image description here

+0

@ Johnathon64 - можете ли вы попробовать? –

0

Ваш маршрут должен быть таким:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     //routes.IgnoreRoute(""); 
     routes.MapRoute(name: "DevicesAPIRoute", 
          url:"DevicesAPI/GetLatestDevice/{latestUpdate}", 
          defaults: new { controller = "DevicesAPI", action = "GetLatestDevice", lastUpdate = UrlParameter.Optional }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
+0

Пробовал это и получил ошибку 404 – Johnathon64

+0

URL, который вы пытаетесь? –

+0

http: // localhost: 53658/api/DevicesAPI/GetLatestDevice/2001-01-01 – Johnathon64