You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.Net Web Controller中JsonResult接口返回HTML而非JSON的求助

问题分析与解决方案

核心问题

控制器中的DeleteAccount方法在调用内部API后,前端收到的响应是login.cshtml的HTML代码,而非预期的JSON;但调试控制器时能返回正确JSON,注释内部API请求代码后接口恢复正常。

可能原因

  1. 同步调用异步方法导致死锁:使用.Result同步等待异步API请求,会阻塞当前线程并持有ASP.NET同步上下文,引发上下文死锁,最终触发身份验证重定向(比如会话上下文异常导致系统判定用户未登录)。
  2. 内部API调用丢失身份凭证:调用内部API时未传递当前请求的身份信息(如Cookie、Token),导致内部API因身份验证失败重定向到登录页面,该重定向响应被直接返回给前端。

解决方案

1. 修复异步调用方式,避免死锁

将控制器方法改为异步,用await替代.Result,这是ASP.NET中处理异步操作的标准方式,可避免同步阻塞导致的上下文问题:

public async Task<JsonResult> DeleteAccount(AccountDeletion accountDeletion)
{
    string msg, sts, is_success;
    try
    {
        var response = new ApiResponse();
        var reqDTO = new ChangePassword
        {
            email = accountDeletion.email,
            currentPassword = accountDeletion.password,
            username = accountDeletion.username
        };
        // 用await异步等待API响应,替代同步阻塞的.Result
        response = await _client.PutApiResponse<ApiResponseConfirmPassword>($"{url}/api/Authentication/submit-delete-account", reqDTO);

        sts = response.StatusCode;
        msg = response.messsage;
        is_success = response.IsSuccess;
    }
    catch (Exception e)
    {
        msg = e.Message;
        sts = "fail";
        is_success = "false";
    }

    // 修正原代码中success固定为"false"的逻辑错误,根据实际结果返回
    return Json(new { data = "", status = "200", message = msg, success = is_success });
}

2. 确保内部API调用传递身份凭证

如果项目使用Cookie认证,初始化HttpClient时配置Cookie容器,自动传递当前请求的Cookie:

// 在初始化_client的代码中添加Cookie容器
var handler = new HttpClientHandler
{
    UseCookies = true,
    CookieContainer = new CookieContainer()
};
// 从当前请求中复制Cookie到容器
foreach (var cookie in Request.Cookies)
{
    handler.CookieContainer.Add(new Uri(url), new Cookie(cookie.Key, cookie.Value));
}
_client = new HttpClient(handler);

如果是Token认证,在请求头中携带当前用户的Token:

// 在API请求前添加Authorization头
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", User.FindFirst("access_token")?.Value);

3. 排查授权与重定向配置

  • 检查DeleteAccount方法的授权属性(如[Authorize]),确保当前用户权限符合要求;
  • 检查内部API的认证配置,确认其不会在身份验证失败时直接返回重定向响应,可改为返回401状态码,由前端处理。

4. 前端请求补充处理(可选)

在Ajax的error回调中添加重定向检测,避免前端收到HTML后无响应:

error: function (jqXHR, textStatus, errorThrown) {
    // 检测到302重定向时,跳转到登录页或提示用户
    if (jqXHR.status === 302) {
        window.location.href = jqXHR.getResponseHeader('Location');
    }
}

内容的提问来源于stack exchange,提问作者Maing Gundul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:50:12