【问题标题】:Should I be using POST or GET when retrieving JSON data into jqGrid in my ASP.NET MVC application?在我的 ASP.NET MVC 应用程序中将 JSON 数据检索到 jqGrid 时,我应该使用 POST 还是 GET?
【发布时间】:2012-06-13 18:14:35
【问题描述】:

我在我的 ASP.NET MVC 应用程序中使用jqgrid。目前我有 mTYPE: 'POST' 这样的:

jQuery("#myGrid").jqGrid({
    mtype: 'POST',
    toppager: true,
    footerrow: haveFooter,
    userDataOnFooter: haveFooter,

但我正在阅读this article,我看到了这段:

浏览器可以在用户的​​硬盘上缓存图像、JavaScript、CSS 文件 驱动器,如果调用是 HTTP GET,它还可以缓存 XML HTTP 调用。 缓存基于 URL。如果它是相同的 URL,并且它已被缓存 在计算机上,然后从缓存加载响应,而不是从 服务器再次请求时。基本上,浏览器可以 缓存任何 HTTP GET 调用并根据 URL 返回缓存的数据。如果 您以 HTTP GET 的形式进行 XML HTTP 调用,服务器返回一些 通知浏览器缓存响应的特殊标头,在 未来的调用,响应将立即从缓存中返回 从而节省了网络往返的延迟和下载时间。

鉴于这种情况,我是否应该将我的 jqGrid mType 全部切换为使用“POST”中的“GET”作为 mType? (它说的是 XML(没有提到 JSON)。如果答案是肯定的,那么实际上我会想要对 jqGrid mType 使用 POST 的情况是什么,因为它似乎在没有这种缓存优势的情况下做同样的事情?

【问题讨论】:

    标签: ajax asp.net-mvc performance caching jqgrid


    【解决方案1】:

    您描述的问题可能在 Internet Explorer 中,但 如果您使用默认选项,jqGrid 中将不存在此问题

    如果您查看将使用的完整 URL,您会看到类似的参数

    nd=1339350870256
    

    jQuery.ajax中的cache: true含义相同。 jqGrid 将当前时间点添加到 URL 以使其唯一。

    我个人喜欢在jqGrid中使用HTTP GET,但我不喜欢nd参数的用法。我在the old answer 中描述的原因。最好使用 jqGrid 的 prmNames: {nd:null} 选项,它可以删除 URL 中 nd 参数的使用。而不是可以控制服务器端的缓存。比如设置

    Cache-Control: private, max-age=0
    

    是我的标准设置。要设置 HTTP 标头,您只需在 ASP.NET MVC 操作的代码中包含以下行

    HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0));
    

    您可以在the answer找到更多详细信息。

    重要的是要理解,标头Cache-Control: private, max-age=0 不会阻止数据的缓存,但如果没有在服务器上重新验证,数据将永远不会被使用。使用其他 HTTP 标头选项 ETag 您可以使重新验证真正起作用。主要思想是,ETag 的值将始终在更改服务器上的数据时更改。如果之前的数据已经在网络浏览器缓存中,则网络浏览器自动在 HTTP 请求中发送If-None-Match 部分,并从缓存数据中发送ETag 的值。因此,如果服务器看到数据没有更改,它可以使用具有304 Not Modified 状态和空正文 HTTP 响应的 HTTP 响应进行响应。它允许网络浏览器使用本地以前缓存的数据。

    the answerthis one 中,您将找到如何使用ETag 方法的代码示例。

    【讨论】:

      【解决方案2】:

      如果服务器发送的数据发生变化,那么你应该使用 POST 来避免每次请求时都获取缓存数据。

      【讨论】:

        【解决方案3】:

        您不应将 GET 用于所有目的。 GET 请求应该用于从服务器获取数据,而不是用于保存或删除操作。 GET 请求有一些限制,因为您发送到服务器或附加为查询字符串的数据您不能使用 GET 请求发送非常大的数据。此外,您不应使用 GET 请求将敏感信息发送到服务器。在添加、编辑和删除等所有其他情况下,您应该发出 POST 请求。

        据我所知,jqgrid 会在每个 GET 请求中附加一个唯一键,因此您不会从浏览器缓存中获得任何好处。

        【讨论】:

          【解决方案4】:

          解决缓存行为的一种方法是在每次发出请求时使 GET 唯一。 jQuery.ajax() 通过将时间戳附加到请求的末尾来使用“缓存:false”来执行此操作。您可以使用类似的方法复制此行为:

          uri = uri + '?_=' + (new Date()).getTime(); // uri represents the URI to the endpoint
          

          【讨论】:

            猜你喜欢
            • 2016-05-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-25
            • 1970-01-01
            • 1970-01-01
            • 2016-09-16
            相关资源
            最近更新 更多