当前位置: 首页 > 面试题库 >

jQuery AJAX不应该产生304个响应

龙星渊
2023-03-14
问题内容

这真的让我挠头。即是因为它仅在IE中发生,而不在Firefox中发生,而且我给人的印象是jQuery实际上是浏览器无关的。在过去的几个小时中,我一直在努力解决这个问题,至少已经确定了正在发生的事情。

这个jqGrid:

$("#DocumentListByPartRecordsGrid").jqGrid(
          {
            datatype: 'local',            
            colNames: ['<b>Id</b>', '<b>Document Name</b>', '<b>Document Type</b>', '<b>Effective Date</b>', '<b>Expiration Date</b>', '<b>Delete</b>'],
            colModel: [
                  { name: 'ASSOCIATION_ID', Index: 'ASSOCIATION_ID', resizable: true, align: 'left', hidden: true, sortable: false },
                  { name: 'FILE_NAME', Index: 'FILE_NAME', resizable: true, align: 'left', sortable: false, width:'20%' },
                  { name: 'DOCUMENT_TYPE', Index: 'DOCUMENT_TYPE', resizable: true, align: 'left', sortable: false, width:'20%' },
                  { name: 'EFFECTIVE_DATE', Index: 'EFFECTIVE_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
                  { name: 'EXPIRATION_DATE', Index: 'EXPIRATION_DATE', resizable: true, align: 'left', sortable: false, width:'20%' },
                  { name: 'Delete', Index: 'Delete',resizable: true, align: 'center', sortable: false, width:'20%' },
                  ],            
            rowNum: 15,
            rowList: [15, 50, 100],
            imgpath: '/Drm/Content/jqGrid/steel/images',
            viewrecords: true,            
            height: 162,           
            loadui: 'block',
            forceFit: true
        });

填充此功能:

var mydata = '';    
<% if(!string.IsNullOrEmpty(Model.PCAssociatedDocuments)) { %>        
   var mydata = <%= Model.PCAssociatedDocuments %>;
<% } %>

for (var i = 0; i <= mydata.length; i++){
        jQuery("#DocumentListByPartRecordsGrid").addRowData(i, mydata[i], "last");
        }

这是从模型中干净填充的。这不是问题。使用删除功能时会出现问题,该功能在控制器中的格式如下:

<a class='deleteAttachment' style='cursor: pointer;' href='#' onclick='javascript:PCDocumentDelete(" + s.AssociationId.ToString() + ", " + pcId + ");'>Delete</a>

并调用此函数

function PCDocumentDelete(id, pcid) {
if (confirm("Are you sure you want to delete this document?")) {
    $.blockUI({
        message: "Working...",
        css: {
            background: '#e7f2f7',
            padding: 10
        }
    });
    $.ajax(
        {
            url: '/DRM/Pc/DeleteAssociation?associationId=' + id + '&pcid=' + pcid,
            async: true,
            dataType: "json",
            success: function(result) {
                if (result.Success == true) {
                    //Reload grid                       
                    $.ajax({ async: false });
                    $("#DocumentListByPartRecordsGrid").setGridParam({ url: "/Drm/Pc/DeAssociatePartRecordsWithDocument?pcid=" + pcid, datatype: 'json', myType: 'GET', page: 1 });
                    $("#DocumentListByPartRecordsGrid").trigger("reloadGrid");
                    $.unblockUI();
                    $.showGlobalMessage('Specified document has been successfully disassociated from this part record.');
                }
                else {
                    $.unblockUI();
                    $.showGlobalMessage('An error occurred deleting the attachment.');
                }
            },
            error: function(res, stat) {
                alert(res.toString());
                alert(stat.toString());
            }
        });
    return false;
}
else {
    return false;
}

}

(showGlobalMessage是一个内部函数,可创建格式特别的blockUI)

Ajax在控制器中调用了一个方法,但是这个问题在我们做得那么远之前就出现了,所以除非有人认为它很重要,否则我不会发布该代码。通常由于种种原因,发生的结果是,调用PC
/
DeleteAssociation的第一个ajax突发以304(未修改)响应返回。我知道,当没有任何变化需要刷新时,就会发生这种情况。但这不是一个收获,应该将其视为帖子,而我的印象是,除非另有指示,否则jquery.ajax旨在不生成304个响应。我显然在这里错过了一些东西,而且盯着它看得太久了,以至于我自己也找不到。有人看到我错过了吗?谢谢。


问题答案:

我看不到,您将ajax请求指定为POST。所以基本上添加:

$.ajax({ type: 'POST' });

如果仍然失败(由于某些浏览器AJAX怪异),则可以尝试设置cache: false

$.ajax({ type: 'POST', cache: false });

顺便说一句,所有缓存:false会在请求URL中添加一些随机内容。

编辑1:

关于

…而且我的印象是,除非另有指示,否则jquery.ajax旨在不生成304个响应

jQuery在这里没有生成任何响应。304标头只是一个HTTP标头。HTTP
AJAX请求是普通的HTTP请求,并且可以返回任何有效的头。如果服务器以304响应,则XHR对象将仅提供来自服务器的本地缓存响应。但是,对于用户而言,它是完全透明的。

编辑2:

删除了有关防止缓存的建议。在我看来就像伏都教。

编辑3:

再次添加该位,因为显然有必要。环顾网络,IE似乎在某种程度上非法缓存了AJAX POST。



 类似资料:
  • 问题内容: 我正在尝试实现过滤器,以记录应用程序中的请求和响应。我使用以下代码: 因此,我收到了我的请求,并按预期方式记录了响应。以下是日志: 但是,返回空响应。这是来自的输出: 有任何想法吗? 谢谢 问题答案: 经过几个小时的努力,我终于找到了解决方案。 简而言之,应该在过滤方法的最后调用。 通过从响应输出流中读取响应主体来缓存响应主体。因此,流变为空。应当将响应写回到输出流。

  • HTTP响应消息的响应状态行分为三部分:HTTP版本、状态码和状态信息,如下所示: HTTP/1.1 200 OK 其中HTTP版本可以是HTTP/1.1或HTTP/1.0,这由Web服务器所支持的HTTP版本决定。状态信息的内容和状态相关,如404状态码所对应的HTTP1.1规范中的状态信息是Not Found。由于HTTP版本一般是基本固定的,而状态信息是随着状态码的变化而变的。因此,在HTT

  • 我认为浏览器在被响应时使用了它的缓存,并发现被缓存为的资源,因此拒绝满足请求。 我怎样才能缓解这里的问题?有什么想法吗?

  • 条件 GET 是一个伟大的方式来减少带宽,并可能提高对服务器端性能,根据信息用于确定条件是如何计算出来的。一个设计良好的网站例如返回 304 (Not Modified) 响应给它提供的静态图像服务。 JAX-RS 使用上下文接口Request来提供对条件 GET 的支持。 下面的例子显示了对条件 GET 的支持: Example 7.7. Conditional GET support publ

  • 将在文件中说明的任何时候安装,但是将更新所有的依赖关系,并根据是什么创建一个新的文件需要在。 所以很多人说只在开发中运行。但是我的问题是做确实替换了旧的文件,如果你的应用程序要中断,它将中断,因为可能与新更新的依赖项冲突。 我遇到了一种情况,我必须执行,这个问题与扩展有关。唯一的解决方案是进行PHP-pcntl模块安装 我不明白为什么人们害怕在生产中运行。

  • 我正在使用Github的grpc网关项目从gRPC规范自动生成REST API。在这个REST API中,我想支持标头和304 Not Modify响应。 据我所知,通常情况下,您会在gRPC服务器中创建一个带有特定状态代码的响应,然后该状态代码将由gRPC网关转换为HTTP状态代码。然而,由于标准gRPC并不真正支持缓存概念,因此没有映射到HTTP 304状态代码的gRPC状态代码。 使用grp