为什么ajax调用期望类型json在生产中未捕获HttpStatusCodeResult中的消息,但在Staging中工作正常?

why does ajax call expecting type json not capture message in HttpStatusCodeResult in production but works fine in Staging?

提问人:Anusha Bivera 提问时间:10/30/2023 最后编辑:marc_sAnusha Bivera 更新时间:10/30/2023 访问量:30

问:

我有一个应用程序,其中 ASP.NET 4.6 Web API 在发生错误时返回对象,并在成功时返回 JSON 对象:HttpStatusCodeResult

public class CertificationController : Controller
{
   public async Task<ActionResult> GetImagesAsync(string certFilter)
   {
       try
       {
          int imageCount = GetImagesCount(certFilter);

          if (imageCount == 0)
          {
             return new HttpStatusCodeResult(404, "No images to download");
          }
          else if (imageCount > 100)
          {
             return new HttpStatusCodeResult(400, "Cannot download more than 100 images");
          } 
          else
          {
             string PathToImageZipfile = ZipImages(certFilter);
             return Json(new{zipfile=PathToImageZipfile});
          }
       }
       catch(Exception e)
       {
           return new HttpStatusCodeResult(400, "Failed to download images");
       }
   }
} 

上面的 API 方法是使用 Ajax 在前端调用的:

getImages(filtercert: string): any {
    notifierInstance.setNotifier(true, appConst.LoadingText);

    var certDataFilter = ko.toJSON(filtercert);

    return $.ajax({
        url: "/certificate/getImagesAsync",
        data: '{"certfilter":' + certDataFilter + '}',
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        async: true,
        beforeSend: function (xhr) {

            notifierInstance.setNotifier(true, appConst.downloadWaiting);
        },
        success: function (data, textStatus, xhr) {
            window.open(data);
            notifierInstance.setNotifierSelfHide(appConst.downloadWaiting);
        },
        error: function (xhr, status, error) {
            if (xhr.status == 400) {
                notifierInstance.setNotifierErrorSelfHideLongWait(error);
            }
            else if (xhr.status == 404) {
                notifierInstance.setNotifierWarningSelfHideLongWait(error);
            }
            else {
                notifierInstance.setNotifierError(appConst.ErrorLoadingText);
            }
        }
    });
}

ajax 调用能够在暂存和较低环境中读取对象内部的自定义消息。但在生产环境中,ajax 调用无法读取对象内部的自定义消息。HttpStatusCodeResultHttpStatusCodeResult

我知道,由于ajax需要JSON类型的对象,因此ajax调用无法读取中的自定义消息。但是,该问题仅在生产环境中发生,我必须在较低的环境中重新创建此问题,以说服我的主管 API 代码无法返回到期望 JSON 类型响应的 ajax 调用。HttpStatusCodeResultHttpStatusCodeResult

如何在开发/QA/暂存环境中重现此生产问题?

我尝试在开发环境中部署,其中连接字符串指向开发数据库的生产代码。代码在开发环境中没有任何错误

jquery asp.net ajax asp.net-mvc

评论

0赞 David 10/30/2023
具体失败是什么?在浏览器的调试工具中,浏览器控制台上是否有任何错误?在这些工具的“网络”选项卡上,是否发出了 AJAX 请求?服务器的响应是什么?在这些工具的脚本调试器中,调试时具体会发生什么?
0赞 Anusha Bivera 10/30/2023
前端脚本使用 HttpStatusCodeResult 对象中的消息在通告程序中显示。由于在返回 400/404 错误时,ajax 调用的错误处理永远不会收到消息,因此通知程序将显示不显示任何消息。它就像一个空的警报窗口。http 响应仅返回状态代码 (400/404) 和状态文本,例如“错误请求”/“未找到”。我在想,生产服务器中的防火墙或IIS设置是否有某种方式可以阻止在调用API时将HttpStatusCodeResult中的消息传输到前端?

答: 暂无答案