C#Webapi POST请求失败 - 404 NOT FOUND

时间:2016-11-24 15:25:52

标签: c# ajax rest post asp.net-web-api

我有一个带有不同动作的webapi Controller类,GET和PUT工作正常,POST一直失败,我很沮丧。也许你可以给我一些提示我如何解决这个问题。

控制器操作:

[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

错误讯息:

  

"消息":"未找到与请求URI匹配的HTTP资源   http://localhost:59732/api/v1/jobs/PostInactiveStatus。&#34 ;,   " MessageDetail":"未找到与命名控制器匹配的类型   ' V1'"

我失败的地方?

更新:Controller已添加了RoutePrefix,用于对API进行版本控制,因为GET和PUT工作正常。

1 个答案:

答案 0 :(得分:2)

假设控制器的名称是String sql = "SELECT poMast.ORDNO, CAST(poMast.ORDNO AS VARCHAR(255) CCSID UNICODE) FROM AMFLIBL.POMAST AS poMast "; ,并且OP中定义了路由模板

JobsController

是准确的,然后更新ajax调用以匹配预期的路由模板

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

其他明智的做法是必须为路线模板中包含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 }
);