【问题标题】:MVC5 app doesn't hit my WebAPI2 POST method for creating new recordsMVC5 应用程序没有使用我的 WebAPI2 POST 方法来创建新记录
【发布时间】:2014-01-18 12:03:33
【问题描述】:

我有一个 MVC5 应用程序 ASP.NET,在创建新记录并单击提交时,它会调用我的 WebAPI(版本 2 - 新版本)将记录插入数据库。问题是,它没有在我的 WebAPI 中使用 POST 方法。无论如何,这是我的 MVC5,“创建”的前端应用程序代码:

[HttpPost]
        public ActionResult Create(BulletinBoard bulletinBoard)
        {
            bulletinBoard.CreatedDate = DateTime.Now;
            bulletinBoard.CreatedBy = HttpContext.User.Identity.Name;

            response = client.PostAsJsonAsync("api/bulletinboard", bulletinBoard).Result;
            if (response.IsSuccessStatusCode)
            {
                return View("Index");
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot create a new feedback record due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return View("Problem");
            }
        }

我已经在我的构造函数中定义了“客户端”,并为它提供了我的 WebAPI 的基本 URL - 请记住 GET 有效 - 所以我的 URL 没有问题。我也可以手动转到我的 WebAPI URL 并在我的浏览器中取回数据。

这是我的 WebAPI 代码:

// POST api/bulletinboard
public HttpResponseMessage PostBulletinBoard(BulletinBoard bulletinBoard)
{
    if (ModelState.IsValid)
    {
        db.BulletinBoards.Add(bulletinBoard);
        db.SaveChanges();

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, bulletinBoard);
        return response;
    }
    else
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
}

这在我使用 WebAPI 版本 1 时有效,该版本对 GET 和 POST 和 PUT 方法有不同的命名约定。

因此,当调用 POST 请求的 URL 时(响应 = client.PostAsJsonAsync... 的行),该请求永远不会在我的 WebAPI 中命中我的 POST 方法,因此,没有记录插入到我的数据库中。我做错了什么?

【问题讨论】:

  • 什么是状态码 (response.StatusCode) 和来自服务器的确切响应负载 (response.Content.ReadAsStringAsync())?您可以在调试器中检查这些值并评估值(Shift+F9,然后只需键入表达式)。
  • @DarinDimitrov 我实际上在我的 Index 方法中使用 response.Content.ReadAsAsync() 从数据库中获取记录 - 所以当我导航到 WebAPI 的 GET URL (locahost/MyWebAPI/BulletinBoard ),我会在浏览器中返回代表数据的 JSON 对象列表。
  • 我不是在问你在浏览器中得到了什么,而不是你从 GET 请求中得到什么 :-) 我要求你在你的客户端代码的 if (response.IsSuccessStatusCode) 行放置一个断点和执行我之前在评论中写的内容。我对response.Content.ReadAsStringAsync() 的值特别感兴趣。基本上,这将告诉您远程服务器响应您的 POST 请求返回的内容。您正在查找的错误消息可能会简单地包含在此字符串中。
  • 抱歉,您编辑了您的评论 - 如果我没记错的话,您问我使用 ReadAsStringAsync 得到了什么。我会放一个断点,但如果我没记错的话,那是一个 500 错误。给我几分钟
  • @DarinDimitrov - 对不起,我完全误解了你。我认为出于某种原因你想要我的 GET 响应内容。这是我的回复内容:我认为这为我指出了问题所在的正确方向:

标签: c# asp.net-mvc-4 asp.net-web-api asp.net-mvc-5


【解决方案1】:

根据 cmets,您似乎发布了无效数据(根据您在 BulletinBoard 模型中定义的验证规则)并且此验证根本失败。因此,要解决此问题,请确保您发送的是有效数据。

【讨论】:

    【解决方案2】:

    我认为它没有达到您的 post 方法的原因可能有几个。这是我的 Post 方法示例。需要注意的是方法名FromBody属性

    public async Task<HttpResponseMessage> Post([FromBody]FoodProduct foodProduct)
    {
          UnitOfWork.FoodRepository.Edit(foodProduct);
          await UnitOfWork.SaveAsync();
          return Request.CreateResponse(HttpStatusCode.OK);
    }
    

    我也喜欢在我的控制器上使用这个新的 RoutePrefix 属性,它工作得很好而且看起来不错。

    [RoutePrefix("api/Food")]
    public class FoodController : BaseApiController
    {
       ///some code here
    }
    

    【讨论】:

    • 您不需要将[FromBody] 用于复杂类型。这是默认设置,不会改变任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2021-10-02
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多