【问题标题】:C# Webapi POST request fails - 404 NOT FOUNDC# Webapi POST 请求失败 - 404 NOT FOUND
【发布时间】:2016-11-25 00:05:54
【问题描述】:

我有一个具有不同操作的 webapi 控制器类,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) {

        }
    });
}

}

错误信息:

"Message": "未找到与请求 URI 匹配的 HTTP 资源 http://localhost:59732/api/v1/jobs/PostInactiveStatus.", "MessageDetail": "没有找到与名为的控制器匹配的类型 'v1'。”

我哪里失败了?

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

【问题讨论】:

  • 好吧,基于路由模板的没有 v1。具有上述操作的控制器的名称是什么

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


【解决方案1】:

假设控制器的名称是JobsController,并且OP中定义的路由模板

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

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

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

更新

根据添加的信息,缺少该操作的路由属性。将其包含在操作中。

[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) { ...}
}

【讨论】:

  • 他也可以尝试在api方法中添加Route属性。 [Route("api/v1/jobs/PostInactiveStatus")]
  • 是的,但是OP没有说明属性路由是否应用于控制器。
  • 我添加了一个更新,我在控制器级别使用 Routeprefix 进行版本控制。
  • 那你就少了[Route("PostInactiveStatus")]
  • 啊...你是对的:-/。我现在尝试了,但我遇到了另一个问题,即传递给控制器​​的简单类型(作业)为空!?!
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2023-03-05
  • 2021-03-31
  • 2015-06-09
  • 2015-01-14
  • 1970-01-01
  • 2019-02-12
  • 2015-01-04
相关资源
最近更新 更多