2016-11-24 129 views
2

我有一个webapi控制器类与不同的行动,GET和PUT工作正常,POST是失败的整个时间,我很沮丧。也许你可以给我一些提示,告诉我如何解决这个问题。C#Webapi POST请求失败 - 404 NOT FOUND

控制器动作:

[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); 
} 

客户端请求:

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' 。”

我在哪里失败?

更新:控制器已经添加了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 } 
); 

是精确定义的路径模板,然后更新Ajax调用匹配,期望的路径模板

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

其他明智新路线将具有该网址,其中包括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

他也可以尝试将'Route'属性添加到api方法。 '[Route(“api/v1/jobs/PostInactiveStatus”)]' – esiprogrammer

+0

是的,但是OP没有指出属性路由是否应用于控制器。 – Nkosi

+0

我已添加更新,我在控制器级别上使用Routeprefix来进行版本控制。 – user12282