我有一个 Web 应用程序,它具有仪表板功能。许多不同的公司在许多不同的环境中使用该应用程序,所有浏览器。
有一段 javascript 每 60 秒刷新一次仪表板,通过一个 http POST 到一个返回 JSON 的 url。
对于一位用户(并且仅根据我的日志,一位用户)每 60 秒从该 URL 生成以下 .NET 错误消息:
System.InvalidOperationException: This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.
at System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
对于所有其他用户,从来没有问题。
我知道这个用户在代理的网络上(政府)。这个用户是一个新用户——也就是说,我们在这个网络上从来没有其他用户。
以上使我相信他们的代理出于某种原因正在修改请求(尝试带宽优化?),默默地将 POST 转换为 GET。出于安全原因,我的 Asp.NET MVC 应用程序(正确地)拒绝接受请求。
当然,我不太可能更改他们的代理设置。
我尝试将以下内容添加到操作中:
[OutputCache(Duration = 0, Location = OutputCacheLocation.None, NoStore=true)]
也:
Response.Cache.SetNoTransforms();
但问题依然存在。
我是否可以设置任何其他 HTTP 标头来指示代理停止修改内容?使这些代理行为的任何其他方式?或者浏览器中是否有任何可能这样做的东西?
更新:写这篇文章后,来自同一家公司的另外 2 个不同的用户现在正在生成这些错误,这增加了我的代理理论的权重。