【问题标题】:XML Parsing Error: no root element found in ASP.NET Core 2.0 APIXML 解析错误:在 ASP.NET Core 2.0 API 中找不到根元素
【发布时间】:2018-08-12 07:51:06
【问题描述】:

我遇到了这个问题,我想不通。我正在使用 ASP.NET Core 2 和 Ajax。

这是 JavaScript 调试器所说的:

XML 解析错误:找不到根元素位置: http://localhost:52617/api/favorites/ 第 1 行第 1 列:

这是我的 JavaScript 代码:

$(".js-toggle-fav").click(function (e) {
    function sendPost() {
        console.log("inside post send");

        var button = $(e.target);

        $.ajax({
            type: 'POST',
            url: "http://localhost:52617/api/Favorites/",
            data: {"EventId": @Model.Event.EventId},
            contentType: "application/json; charset=utf-8"
        });
    }

    $.getJSON("http://localhost:52617/api/favorites/@Model.Event.EventId", function (data) {
        if (data == null) {
            console.log("fav is null");
            sendPost();
            fav.addClass(toggling);
            fav.text("unfav");
        }
        else {
            console.log("fav is NOT null");
            sendPost();
            fav.removeClass(toggling);
            fav.text("fav");
        }
    );
});

还有我的 API:

[HttpPost]
public async Task<IActionResult> PostFavorite([FromBody] FavoriteDto favorite)
{
    if (!ModelState.IsValid)
    {
        Console.WriteLine(ModelState.ValidationState.ToString());
        return BadRequest(ModelState);
    }
    var uid = _userManager.GetUserId(HttpContext.User);
    var fav = await _context.Favourites.SingleOrDefaultAsync(x => x.EventId == favorite.EventId && x.UserId == uid);
    if (fav == null)
    {
        _context.Favourites.Add(new Favorite { EventId = favorite.EventId, UserId=uid });
    }
    else
    {
        _context.Favourites.Remove(fav);
    }
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateException)
    {
        if (FavoriteExists(favorite.EventId))
        {
            return new StatusCodeResult(StatusCodes.Status409Conflict);
        }
        else
        {
            throw;
        }
    }

    return Ok(favorite);
}

当我使用 Postman 或任何其他客户端执行此操作时,一切都像魅力一样!对于 Ajax,情况并非如此。

注意事项:

  • 在同一个 .cshtml 文件中,有更多的 jQuery 和 JavaScript 代码可以执行类似的操作,并且可以正常工作!所有解决方案 很遗憾,我上网查了一下,没有用。
  • Get 方法(用于返回 List 或单个元素正在工作!)

【问题讨论】:

    标签: ajax asp.net-mvc asp.net-core asp.net-core-mvc


    【解决方案1】:

    问题出在

    data: {"EventId": @Model.Event.EventId},
    

    不要直接传入,而是使用 JSON.Stringify

    var payload = {EventId: @Model.Event.EventId};
    $.ajax({
           type: 'POST',
           url: "http://localhost:52617/api/Favorites/",
           data: JSON.stringify(payload),
           contentType: "application/json; charset=utf-8"
          });
    

    我假设您的 FavoriteDto 类看起来像这样

    public class FavoriteDto
    {
       public int EventId { get; set; }
    }
    

    您收到 xml 错误的原因是控制器操作

    public async Task<IActionResult> PostFavorite([FromBody] FavoriteDto favorite)
    

    无法解析“最喜欢的”,因此它从未被初始化并且为空。然后,您返回 ok(null) ,这会在客户端 ajax 收到来自服务器的响应时导致解析错误。

    【讨论】:

    • 先生。卡里马巴迪!有效 !!但是我现在因为我网站中的另一个按钮正在使用我所做的方法而变得疯狂,但这个没有,不知道为什么该代码有效(注意它确实有多个属性我的代码)?
    • 其他请求是 GET 请求吗?如果是这样,这就是它们起作用的原因,因为您从未发布任何数据。问题又来了,因为 favourite 没有被初始化,因为它无法被解析。我怀疑你所有的其他请求都没有发布数据并且是 POST 请求???
    • 其实是POST请求!这就是让我如此生气的原因:D。
    • 其他 post 端点是否有 [FromBody] 属性?如果他们没有,最喜欢的对象会被初始化,但它只有默认值的数据,所以看起来你有一个最喜欢的对象,但如果你仔细观察,这个对象没有你发送的数据跨度>
    • 我现在明白了!感谢您的帮助和解释^_^
    【解决方案2】:

    我在DELETE 调用 ASP.Net Core 2.1 Web API 期间遇到此错误。我从 DELETEcall 预期的模型中删除了 [FromBody],例如

    public async Task<IActionResult> Delete(MyModel body)
    {
      // Just an example
      await DoSomeWork(body);
    
      return StatusCode(200);
    }
    

    但这并没有解决问题。但是,在我返回一些带有StatusCode 的内容后,在这个例子中只是一个简单的字符串,错误就消失了。所以下面的代码应该可以避免 Firefox 中的错误:

    public async Task<IActionResult> Delete(MyModel body)
    {
      // Just an example
      await DoSomeWork(body);
    
      return StatusCode(200, "Deletion Successfull");
    }
    

    【讨论】:

      【解决方案3】:

      要添加到其他答案,如果 jQuery ajax 得到一个空字符串响应,它需要有效的 JSON,或者根本没有内容,也会发生此错误。

      检查done回调中data的值,如果它是一个空字符串""而不是undefined,你必须修复你的服务器以返回状态码204 (No Content)而不是一个200 (OK) 没有内容。

      在 WebAPI2 中,这意味着返回 StatusCode(HttpStatusCode.NoContent) 而不是 Ok()

      【讨论】:

        猜你喜欢
        • 2021-08-26
        • 2017-09-22
        • 1970-01-01
        • 2018-06-06
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 2021-01-17
        相关资源
        最近更新 更多