【问题标题】:Change default ASP MVC Request Header to add your own values更改默认 ASP MVC 请求标头以添加您自己的值
【发布时间】:2012-05-02 12:45:15
【问题描述】:

我正在尝试将我的所有 ASP MVC HTTP 响应标头更改为默认具有另一个值,以便在我的博客应用程序中实现 Pingback 自动发现。

默认标题(在 Cassini 上)是:

Cache-Control   private
Connection  Close
Content-Length  20901
Content-Type    text/html; charset=utf-8
Date    Fri, 20 Apr 2012 22:46:11 GMT
Server  ASP.NET Development Server/10.0.0.0
X-AspNet-Version    4.0.30319
X-AspNetMvc-Version 3.0

我想要一个额外的附加值:

X-Pingback: http://localhost:4912/pingback/xmlrpcserver

我用谷歌搜索了一下,找到了一个很好的解决方案: -- 从 ActionFilterAttribute 派生并覆盖 OnResultExecuted 方法:

public class HttpHeaderAttribute : ActionFilterAttribute
    {

        public string Name { get; set; }
        public string Value { get; set; }

        public HttpHeaderAttribute(string name, string value)
        {
            Name = name;
            Value = value;
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Request.Headers.Add(Name, Value);
            base.OnResultExecuted(filterContext);
        }

    }

然后我简单地将属性放在我的控制器方法上:

[HttpHeader("X-Pingback","http://localhost:4912/pingback/xmlrpcserver")]
        public ActionResult Index()
        {
            var allArticles = _repository.GetPublishedArticles(SortOrder.desc);
            return View(allArticles);
        }

当我运行应用程序时,我收到以下错误:

有什么想法吗?

【问题讨论】:

  • 你试过用 IISExpress 代替 Cassini 吗?
  • @dtryon 不,我现在就试试,然后告诉你
  • 确实是来自卡西尼的错误 ;)
  • 我是唯一一个发现您正在向请求对象添加标头...而不是响应的人吗?
  • @LostInJavaScriptLand 所以终于有人发现了它:-p。在我真正的应用程序中,我在响应而不是请求,但这是一个错字:-p

标签: c# asp.net-mvc http-headers


【解决方案1】:

我知道这篇文章很旧......但想指出,虽然 OnResultExecuting 是执行此操作的正确方法,但原始帖子显示他正在尝试向请求添加标头。不能简单地将标头添加到请求中并期望它们出现在响应中。 ;-)

此外,将标头添加到响应中的正确方法...也适用于 Cassini...是使用以下内容:

filterContext.HttpContext.Response.AddHeader("X-My-Request-Header", "works in cassini");

【讨论】:

  • 请注意,问题是指将标头添加到请求中,而不是响应中。
  • 实际上 Elliveny,问题的第一行表明他正在尝试修改响应标头,而不是请求标头。他的示例错误地尝试修改请求标头。
  • 对于 MVC Core 2.x,方法现在是:filterContext.HttpContext.Response.Headers.Add()
【解决方案2】:

我相信您的问题可能只是您尝试修改标头太晚了,因为您是在OnResultExecuted 中进行的。请尝试覆盖 OnResultExecuting

http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.onresultexecuting.aspx

【讨论】:

  • 刚刚尝试过,仍然是相同的“平台”错误。我会试一试iis express
  • 所以你是对的先生!它应该是 OnResultExecuting 和 IIS express!
【解决方案3】:

这可能有效,也可能无效(显然,如果无效,我将删除未来用户的答案)。听起来像Operation is not supported by this platform 例外,Cassini 许多不支持自定义标头(这很奇怪,但有可能)。我的建议是确保您使用的是Visual Studio 2010 SP1,然后安装IIS Express(这是对 Cassini 的升级,更像是真正的 IIS),然后将您的项目切换为使用 IIS Express,看看您是否得到同样的例外。

此外,您可能需要查看Why does HttpCacheability.Private suppress ETags?,因为它还可能为您提供替代解决方案。

【讨论】:

  • 感谢埃里克!应该是 IIS express 避免平台问题,然后使用 OnResultExecuting !
  • 是的,似乎应该归咎于卡西尼号。以及 bhamin 建议使用其他事件的方法也被证明是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多