3

我已经为此苦苦思索了一段时间,并决定让 SO 社区对此进行破解......

我有一些操作可以响应来自客户端的 POST,这些操作执行简单的任务,JsonResult如果成功,则返回从匿名类构建的具有简单布尔“成功”属性的操作,或者如果操作不成功,则返回PartialViewResult错误ModelState

<HttpPost()> _
Public Function UpdateHeader(ByVal header As XmlReturnHeader) As ActionResult
    If ModelState.IsValid Then
        Dim updated As Integer = TaxRepository.XmlReturnHeader.Update(header)
        If updated = 1 Then
            Return Json(New With {.Success = True}, JsonRequestBehavior.AllowGet)
        End If
    End If
    Return PartialView("Maintenance/Header", header)
End Function

在客户端,代码同样简单。我想看看结果是否有Success属性,确保它是真的true,然后从那里开始:

$.post('<%= Url.Action("UpdateHeader") %>', $(this).serialize(), function (data) {
    if (data.Success && data.Success === true) {
        $('#list').trigger('reloadGrid');
        $('#edit').dialog('close');
    } else { // result must be the HTML
        $('#edit').html(data);
    }
});

但是,我遇到了问题测试。我从回调函数收到的data对象总是如下所示:

{ success: true }
  ^

sin是小写的success,而且因为JS是区分大小写的,所以有问题。

奇怪的是,如果我将 VB.NET 代码更改为

Return Json(New With {.Garbage = True}, JsonRequestBehavior.AllowGet),

我会收到

{ Garbage: true } 

如果我把它改回New With { .Success = True },我会再次看到小写的s

我正在使用 IIS 和 IE9 进行测试。我觉得响应以某种方式被缓存了。在应用程序中的其他地方,我使用小写的“成功”作为匿名JsonResult参数中的属性。也许 IIS 正在缓存来自先前 GET 或 POST 请求的响应?

[更新]

为了测试响应缓存理论,我将代码更改为:

Return Json(New With {.Success = True, .Random = DateTime.Now.Ticks},
   JsonRequestBehavior.AllowGet)

这导致在客户端收到正确的响应。伟大的。但之前到底发生了什么?我认为 POST 可以免于缓存?还是只有请求而不是响应?

以后如何避免这种情况?

[更新]

另一个花絮:我确实通过 jQuery 全局禁用缓存我的请求,但我没有OutputCacheAttribute在服务器端使用任何 s 或任何此类“无缓存”机制。我快速拍打<OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")>整个控制器,.Random从 JSON 中删除了属性,但仍然收到{ success: true }.

我已经回收了应用程序池,删除了临时 .NET 文件,并清除了浏览器缓存,但同样的问题仍然存在。

4

1 回答 1

0

如果你还没有看过,不妨看看下面这篇关于 ASP.net MVC 中的输出缓存的文章:http: //juristr.com/blog/2012/10/output-caching-in-aspnet- MVC/

根据文章,默认响应标头包括:

Cache-Control:private

这意味着 IE可以将响应缓存在私有缓存中。本文提供了三个选项来禁用这些请求的缓存:在服务器上全局禁用它(出于客户端性能原因我不建议这样做),编写自定义全局操作过滤器(具有相同的结果),或添加一个属性到您的控制器操作称为 OutputCache:

<OutputCache(Duration:=0)>

虽然 jQuery 设置应该执行类似的功能,但它可能不会获得相同的结果。试试这个,看看它是否有效。

于 2014-10-03T14:38:53.423 回答