Ajax 调用在我的 ASP.NET MVC 4 项目中偶尔返回 403 错误

Posted

技术标签:

【中文标题】Ajax 调用在我的 ASP.NET MVC 4 项目中偶尔返回 403 错误【英文标题】:Ajax calls sporadically returning a 403 error in my ASP.NET MVC 4 project 【发布时间】:2021-07-26 16:34:14 【问题描述】:

我刚刚注意到当我将 ASP.NET MVC 4 项目发布到我们的 UAT Web 服务器上时发生的一个问题,我在本地测试时没有遇到该问题。我有一个带有下拉列表的表单,它由 AJAX 调用填充,以从存储过程中获取值。这些调用似乎随机返回 403 禁止错误,我无法确定原因。被调用的方法前一刻工作正常,然后是 403。任何提示将不胜感激。请看下面的详细信息:

Ajax JQuery 调用:

    $.fn.GetOriginalValue = function() 
        var cobId = $("#startcob").val();
        var sourceSystemId = $("#SelectedSourceSystemID").val();
        var sourceSystem = $("#SelectedSourceSystemName").val();
        var metricName = $("#SelectedMetricName").val();

        var clientId;
        var dataToSend;

        if (isJuno) 
            clientId = $("#ClientID").val();
            var key2 = $("#key2").val();
            var key3 = $("#key3").val();
            var key4 = $("#key6").val();
            var key5 = $("#key9").val(); 
            var currency = $("#cmdCurrency").val();
            dataToSend = 
                key1: clientId,
                key2: key2,
                CobId: cobId,
                key3: key3,
                key4: key4,
                key5: key5,
                metricName: metricName,
                currency: currency,
                sourceSystem: sourceSystem
            ;
         

        if (dataToSend != null) 
            $.ajax(
                cache: false,
                type: 'POST',
                url: '@Url.Action("GetCurrentValueJuno")',
                data: dataToSend,
                success: function(data) 
                    if (data.success && data.currentValue != null) 
                        $("#OriginalValue").val(data.currentValue);
                     else 
                        $("#OriginalValue").val("");
                    
                
            );
        
    ;

控制器方法:

    /// <summary>
    /// Lookup the current value of a metric
    /// </summary>
    /// <param name="key1"></param>
    /// <param name="key2"></param>
    /// <param name="cobId"></param>
    /// <param name="key3"></param>
    /// <param name="key4"></param>
    /// <param name="key5"></param>
    /// <param name="metricName"></param>
    /// <param name="currency"></param>
    /// <param name="sourceSystem"></param>
    /// <returns></returns>
    [AllowCrossSiteJson]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult GetCurrentValueJuno(
        int? key1,
        int? key2,
        DateTime? cobId,
    string key3,
        int? key4,
        int? key5,
        string metricName,
        string currency,
        string sourceSystem
        )
    
        if (key1 != null && key2 != null && cobId != null)
        
            //method calls stored procedure to obtain current value based on inputs provided
            var metrics = CFAQueries.GetCurrentValueJuno(
                key1,
                key2,
                cobId,
                key3,
                key4,
                key5,
                metricName,
                sourceSystem);

            var currentValue = metrics?.Value ?? 0;

            if (!string.IsNullOrEmpty(currency))
            
                var fxrate = GetFxRate((DateTime)cobId, currency);
                currentValue = currentValue / (fxrate ?? 1);
            

            return Json(
                new
                
                    currentValue = currentValue,
                    success = metrics != null
                ,
                JsonRequestBehavior.AllowGet);
        

        return Json(
            new
            
                success = false
            ,
            JsonRequestBehavior.AllowGet);
    

屏幕截图显示了带有方法调用的“网络”选项卡,一个失败,一个成功,间隔片刻,具有完全相同的表单输入。

在调查之后,我尝试将以下内容添加到我的 web.config:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

我也尝试过接受的答案:Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method

但是两者都没有解决我的问题。任何帮助或建议将不胜感激。谢谢。

【问题讨论】:

使用 http 检查您的托管位置,如果是 https 则会阻止您的请求 控制器名称是什么? 嗨,Rahul,它是 HTTP,并且大部分时间都使用相同的调用(请参见屏幕截图 1)。正是这种表面上的不一致让我感到困惑。 嗨 Jayrag,控制器名称是 CFAController,它可以很好地访问控制器方法 删除 [AllowCrossSiteJson] 并尝试 【参考方案1】:

你有多个 access-control-allow-origin

检查这个问题Access-control-allow-origin with multiple domains

【讨论】:

谢谢,我删除了 [AllowCrossSiteJson] 并重新发布,但仍然得到相同的混合响应,大部分都有效,但偶尔不会,但现在只有一行访问控制允许来源。 你在 Global.asax.cs 中允许 Access-Control-Allow-Origin 吗?? POST crrfwsuat.barcapint.com/CAMJUNO/CFA/GetCurrentValueJuno 403(禁止)发送@jquery?v=Ahs0DmGdq6s…9HvfWfUlDTMZlXdY1:1 ajax @jquery?v=Ahs0DmGdq6s…9HvfWfUlDTMZlXdY1:1 jQuery.225,11.axd?r= 1_16…2,1_173-4iXKf:10654 $.fn.GetOriginalValue @ VM1165:343 $.fn.SetDropdownRequired @ VM1165:261 eval @ VM1165:157 dispatch @ jquery?v=Ahs0DmGdq6s…9HvfWfUlDTMZlXdY1:1 s @ jquerysDmGd6?v=Ahsq6 …9HvfWfUlDTMZlXdY1:1 ListPicker._handleMouseUp 不,我现在只允许在 web.config 中使用它。像这样: 跨度> 在RouteConfig.cs中设置任意路由?

以上是关于Ajax 调用在我的 ASP.NET MVC 4 项目中偶尔返回 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 4控制器并行执行多个ajax调用

ASP.Net MVC Recaptcha Jquery Ajax 问题

为啥我的 Jquery Ajax 调用不起作用?(Asp.net MVC C#)

ASP .NET MVC - 向 ajax 调用返回异常消息

ASP.NET MVC 在 Ajax 调用控制器后显示视图

带有 ASP.NET MVC 的 jquery - 调用启用 ajax 的 Web 服务