2016-11-24 2 views
2

У меня есть класс контроллера webapi с разными действиями, GET и PUT работают нормально, POST не работает все время, и я очень расстроен. Может быть, вы можете дать мне несколько советов, как я могу решить эту проблему.C# запрос WebAPi POST не работает - 404 НЕ НАЙДЕН

Действие контроллера: класс

[RoutePrefix("api/v1/jobs")] 
public class JobsController : ApiController 
{ 
    [ActionName("PostInactiveStatus")] 
    [System.Web.Http.AcceptVerbs("POST")] 
    [System.Web.Http.HttpPost] 
    public IHttpActionResult PostInactiveStatus(Job job) 
    { 
     CsJobSchedulerEntities dataContext = new CsJobSchedulerEntities(); 
     try 
     { 
      var refJob = (from j in dataContext.Job 
          where j.JOB_ID == job.JOB_ID 
          select j).SingleOrDefault(); 

      refJob.JOB_ACTIVE = 0; 
      refJob.JOB_MUSER = job.JOB_MUSER; 
      refJob.JOB_MDATE = DateTime.Now;    

      dataContext.SaveChanges(); 

      var jobs = dataContext.Job.ToList(); 
      return Ok(jobs); 
     } 
     catch (Exception ex) 
     { 
      return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(ex.Message))); 

     } 

    } 
} 

WebapiConfig:

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

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

    //PAM: Add Default Message Handler when Content-Type is Empty 
    config.MessageHandlers.Add(new DefaultContentTypeMessageHandler()); 

    //PAM: Web API configuration and services 
    EnableCrossSiteRequests(config); 

} 

private static void EnableCrossSiteRequests(HttpConfiguration config) 
{ 
    var cors = new EnableCorsAttribute(
     origins: "*", 
     headers: "*", 
     methods: "*"); 
    config.EnableCors(cors); 
} 

Client Request:

function removeJob(data) { 

    jQuery.support.cors = true; 
    $.ajax({ 
     url: HOST + "api/v1/jobs/PostInactiveStatus", 
     type: "Post", 
     data: data, 
     async: false, 
     beforeSend: function() { 

     }, 
     success: function (data) { 

     }, 
     error: function (xhr, ajaxOptions, thrownError) { 

     } 
    }); 
} 

}

Http Request Network request

Сообщение об ошибке:

"Сообщение": "Ни один HTTP ресурс не был найден соответствующий запрос URI http://localhost:59732/api/v1/jobs/PostInactiveStatus.", "MessageDetail": «Ни один тип не был найден соответствующий контроллер с именем ' v1' .»

Где я провал?

UPDATE: Контроллер добавил RoutePrefix для управления версиями API, как указано, GET и PUT работают нормально.

+0

Ну для одного на основе шаблона маршрута нет v1. Каково имя контроллера, который имеет вышеуказанное действие – Nkosi

ответ

2

Предполагая, что имя контроллера JobsController и что шаблон маршрута определен в OP

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

является точным, а затем обновить вызов Аякса соответствует ожидаемому шаблону маршрута

url: HOST + "api/jobs/PostInactiveStatus", 

Другой мудрому для этого URL-адреса должен быть определен новый маршрут, который включает v1 в шаблоне маршрута

config.MapHttpAttributeRoutes(); 

config.Routes.MapHttpRoute(
    name: "V1Api", 
    routeTemplate: "api/v1/{controller}/{action}/{key}", 
    defaults: new { key = RouteParameter.Optional } 
); 

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

UPDATE

на основе добавленной информации, атрибут маршрут для действия отсутствует. включите его в действие.

[RoutePrefix("api/v1/jobs")] 
public class JobsController : ApiController { 
    //POST api/v1/jobs/PostInactiveStatus 
    [ActionName("PostInactiveStatus")] 
    [System.Web.Http.AcceptVerbs("POST")] 
    [System.Web.Http.HttpPost] 
    [Route("PostInactiveStatus")] //<-- this was missing 
    public IHttpActionResult PostInactiveStatus(Job job) { ...} 
} 
+0

, он также может попытаться добавить атрибут «Маршрут» в api-метод. '[Маршрут (« api/v1/jobs/PostInactiveStatus »)]' – esiprogrammer

+0

Да, но OP не указывает, была ли применена маршрутизация атрибутов к контроллеру. – Nkosi

+0

Я добавил обновление, я использую уровень Routeprefix on Controller для целей управления версиями. – user12282

Смежные вопросы