【问题标题】:Duplicate webClient requests sent at exactly the same time from ajax call从 ajax 调用同时发送的重复 webClient 请求
【发布时间】:2016-06-23 16:16:57
【问题描述】:

我面临的问题是 webClient.UploadData 方法从 ajax 请求立即触发了两次。但是从 aspx 页面调用时,相同的 webClient.UploadData 方法只会触发一次。从日志中我可以看到发送的两个请求的时间完全相同.. 2016-06-23 05:54:48.477

下面是代码sn-p-

var DTO = JSON.stringify({Date: date, Month: month, AgeRange: ageRange, MethodName: "Enroll" });

$.ajax({
   type: "POST",
   contentType: "application/json; charset=utf-8",
   url: "/mypath/TasksHandler.ashx",
   data: DTO,
   async: true,
   success: function(result) {
   ......
   }

TasksHander 将调用以下方法 -

using (var client = new WebClient())
{
  client.Headers[HttpRequestHeader.ContentType] = "application/json";
  client.Headers[HttpRequestHeader.Accept] = "application/json";
  var data = Encoding.UTF8.GetBytes(dataInput);
  byte[] result = client.UploadData(url, "POST", data);
  output = Encoding.UTF8.GetString(result, 0, result.Length);
 }

我的猜测是这可能是由于在 ajax 调用中将 async 属性设置为 true 造成的?如果对此有任何想法,请告知。

【问题讨论】:

  • 您的 ajax 调用是否被事件触发?你能分享那部分代码吗

标签: rest webclient webclient.uploaddata


【解决方案1】:

如果您使用点击事件,请确保该事件只被触发一次。为确保这一点,首先取消绑定任何点击事件:

$(selector).unbind('click');

然后绑定你的处理程序:

$(selector).bind('click', function() {//...});

//You can chain calls !
$(selector).unbind('click').bind('click', function() {//...});

如果您使用 buttonsubmit 来触发 ajax 事件,请确保您阻止了默认行为:

$(selector).submit(function(e){
    e.preventDefault();
    //Your ajax call 
    return false;
});

【讨论】:

    【解决方案2】:

    可能是通过 ajax 调用发出了预检请求。

    在这种情况下,浏览器将在POST 请求之前发出带有Access-Control-Request-Method 标头的HTTP OPTIONS 请求。

    您可以在服务器上或通过浏览器网络控制台检查两个请求上的HTTP Method 吗?正如我所说,第一个是OPTIONS,第二个是POST

    要克服这个问题,您有几个选择,可能最简单的方法是确保脚本和它调用的端点位于同一个域中。

    如果您无法通过检查 dataInputdata 变量的值来简单地进行一些条件检查以确保有字节要发送。

    如果这没有帮助,请提供有关设置的更多信息,即脚本 A 在服务器 X 上,脚本 B 在服务器 Y 上,等等。

    【讨论】:

    • Preflighted requests用于跨域资源共享! preflighted requests 通过 OPTIONS 方法向其他域的资源发送 HTTP 请求,以确定实际请求是否可以安全发送。上述问题中,没有跨域HTTP请求!
    • 是的,我知道它们是什么——因为给出的网址只是示例,它可以很容易地跨域——所以为什么要在基本上重复我所说的内容的评论中复制和粘贴一些内容?
    • 您没有在回答中提到cross domain,所以我假设您不知道!给出这样的答案会让读者相信每个 ajax 请求都会发送......
    • 是的,它是一个跨域,正如您所说,它应该是预检请求问题。那么如何在发出实际请求之前停止发送选项请求呢?
    • 在同一个域上制作脚本和端点的第一个选项被排除并且不可能。以编程方式进行一些条件检查的其他选项是理想的。请问您能对此有所了解吗?我认为更好的方法是在请求类型为选项时停止发送请求,并且仅在请求类型为 Post 时才发送。对此的示例代码将很有帮助。此外,远程服务器正在返回带有选项请求本身的实际响应。再次使用 Post 响应返回响应。
    【解决方案3】:

    代码中的问题是有 2 个地方在 HTML 中有一个 CSS 类“dob”,并且有一个带有 $(".dob").each(function(elem,val){... } 此函数导致进行 ajax 调用...

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 2019-10-15
      • 2022-01-25
      • 1970-01-01
      • 2011-08-26
      • 2023-03-08
      • 2017-06-17
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多