在 asp.net 中的 AJAX 调用未命中成功事件

Posted

技术标签:

【中文标题】在 asp.net 中的 AJAX 调用未命中成功事件【英文标题】:Not hitting success event on AJAX call In asp.net 【发布时间】:2021-01-30 16:34:05 【问题描述】:

我正在尝试从服务绑定下拉。但是成功事件没有发生。

科学我总共有 5000 条记录,所以在

web.config 文件我添加了绑定可能是由于这个区域我收到“内部服务器错误”?我不确定这个请指导我哪里做错了

AJAX

var AllProduct = [];
        function GetAllProduct() 
            var params =  DivisionCode: $('#ddlDivision').val() ;
            $.ajax(
                type: 'GET',
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify(params),
                url: 'Header.aspx/GetProduct',
                dataType: 'json',
                async: false,
                success: function (res) 
                    Product(res.d)
                    OnSuccessProductCall();

                
            );
            function Product(pdata) 
                AllProduct = pdata;
            
        
        function OnSuccessProductCall(data, status) 
            result = AllProduct;
            $("[id$='ddlProduct']").append($("<option>").val("0").text("Select"));
            if (result != undefined && result.length > 0) 
                for (i = 0; i < result.length; i++) 
                    $("[id$='ddlProduct']").append($("<option>").val($.trim(result[i].BU_CAT_CODE)).text($.trim(result[i].BU_CAT_DESC)));
                
            
        

服务

调试时我可以看到我的服务返回数据集合但无法点击成功事件

 [WebMethod]
        public static ServiceReference1.PRODUCT[] GetProduct(string DivisionCode)
        
            ServiceReference1.MasterDataServiceClient oClient = new ServiceReference1.MasterDataServiceClient();
            ServiceReference1.PRODUCT[] prod = oClient.GetProducts(DivisionCode, null, null, null, null, null, null, null);
            return prod;
        

Web.Cofig

<system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferPoolSize="20000000">
          <readerQuotas maxDepth="32"
               maxArrayLength="200000000"
               maxStringContentLength="200000000"/>
        </binding>
        <binding name="WSHttpBinding_IMasterDataService" />
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://almhosrwfebpm01.almaraigroup.local:8524/AlmaraiDataService.svc" binding="wsHttpBinding" bindingConfiguration="basicHttp" contract="ServiceReference1.IMasterDataService" name="WSHttpBinding_IMasterDataService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

我的数据类型是JSON

来自 Web 服务的示例数据。

我在哪里做错了。

错误信息

 "Message":"An attempt was made to call the method \u0027GetProduct\u0027 using a POST request, which is not allowed.","StackTrace":"   at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"

【问题讨论】:

成功后添加error: function (request, status, error) alert(request.responseText); ,看看发生了什么。 同上,同时检查浏览器网络选项卡以查看通过您的 ajax 调用返回的确切内容 我收到此消息 "Message":"尝试使用 GET 请求调用方法 \u0027GetProduct\u0027,这是不允许的。","StackTrace":" 在系统.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException " @freedomn-m 我可以看到网络标签什么都看不见 @PakawatSmutkun 我已经在评论区发布了关于错误事件的消息 【参考方案1】:

嗯,从技术上讲,您必须始终包含一个error 事件,以便您知道 ajax 调用何时失败并相应地处理它。忽略它显然是一种不好的做法。

其次,据我所知,WebMethod 不允许 GET 请求,您必须使用 POST 请求,以便它响应并正确发送数据,或者如果您严格想要在GET 请求中使用WebMethod,那么你应该用这个属性来装饰你的WebMethod[ScriptMethod (UseHttpGet = true)]

这里是精炼的ajax 调用,试试这个,看看会弹出什么错误,然后再尝试解决。

var AllProduct = [];
function GetAllProduct() 
    var params =  DivisionCode: $('#ddlDivision').val() ;
    $.ajax(
            type: 'POST', // Modified this to a POST call
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(params),
            url: 'Header.aspx/GetProduct',
            dataType: 'json',
            async: false,
            success: function (res) 
                Product(res.d)
                OnSuccessProductCall();
            ,
            error: function(err)  // Added this event to capture the failed requests.
                console.log(err);
            
   ); 
   // ... Your Further Code ...

【讨论】:

我已经更改了您建议的代码但是我在控制台选项卡上遇到错误,例如:POST localhost:26097/Header.aspx/GetProduct500(内部服务器错误) 这是一个服务器错误,我建议您转到网络选项卡,看看您是否点击了正确的端点以及传递的数据是否正常。 请检查我的更新代码我已经发布了网络标签 i bilevel 一切都很好,因为我得到了 200,即 OK 尝试在GET 请求中使用它,如错误消息中所示,您的服务方法似乎强制它使用GET 请求。然后看看是什么错误。 我已经从 POST 更改为 GET 但仍然相同的错误 500 内部服务器错误【参考方案2】:

添加这个而不是[WebMethod]

[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod(UseHttpGet = true, ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
 public static ServiceReference1.PRODUCT[] GetProduct(string DivisionCode)
        
            ServiceReference1.MasterDataServiceClient oClient = new ServiceReference1.MasterDataServiceClient();
            ServiceReference1.PRODUCT[] prod = oClient.GetProducts(DivisionCode, null, null, null, null, null, null, null);
            return prod;
        

An attempt was made to call the method \u0027GetNextImage\u0027 using a GET request, which is not allowed

【讨论】:

我已经从 type: 'POST' 改为 type: 'GET', @user14304386 如果您更改为“GET”但仍然收到有关使用“POST”的错误尝试 ctrl+f5 清除缓存。 @user14304386 尝试在控制器上添加断点以查看它是否被命中 @AlirezaMadad 我收到错误请检查我更新的代码 @PakawatSmutkun 我尝试使用您的提及代码,但我收到 500 Internal server error【参考方案3】:

更改“数据:JSON.stringify(params)” 试试这个:

data: "obj:" + JSON.stringify(params ) + "",

在网络方法中: 1-将返回类型更改为无效。 2-添加此代码:

javascriptSerializer js = new JavaScriptSerializer();
        Context.Response.Write(js.Serialize(prod));

这篇文章应该有助于: https://www.c-sharpcorner.com/blogs/how-to-retrieve-data-using-ajax-in-asp-net

【讨论】:

我有替换数据:“obj:”+ JSON.stringify(params)+“”,但仍然没有点击成功事件作为错误我得到这样的错误:“消息”:“尝试使用 POST 请求调用方法 \u0027GetProduct\u0027,这是不允许的。","StackTrace":" at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r \n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"

以上是关于在 asp.net 中的 AJAX 调用未命中成功事件的主要内容,如果未能解决你的问题,请参考以下文章

来自弹出表单的 ajax 数据发布未命中控制器方法 ASP.NET MVC

调试 ASP.Net 应用程序 - 跳过未命中的行和断点

调试器未在 .NET 代码中命中断点

AJAX 回调未显示成功消息 - ASP.NET MVC C#

ASP.NET 应用程序调试:断点当前未命中

来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查