一个.NET有深度的问题,求高手帮忙看看

孤城落雁 2013-09-24 02:02:04
在自定义HttpModule的EndRequest事件中向页面输出内容,

(或者在Global的Application_EndRequest事件中)



protected void Application_EndRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Write("1234567");
}




类似上述,

结果在火狐和IE中都没有结果输出,其他双核浏览器IE模式下也没有;
只有在原生chrome或双核浏览器的chrome模式下才有结果。



不知道这是什么原因。。。。
...全文
252 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤城落雁 2013-09-26
  • 打赏
  • 举报
回复
感谢各位的解答,这个问题当天快下班的时候就已经解决了,这两天继续忙其他的事情,就没有来看。 首先对于2楼版主的疑问我说下我的用途: 有个站点(页面比较多,相对来说比较庞大),现在需要在每个页面增加一个JS文件,举个例子,假如就是增加一个统计代码,当然实际上我这次需求不是加统计,本身通用的底部是独立的,加统计的话可以满足了, 而我的需求是必须保证每个页面(很可能有些页面不包含底部文件,比如一个远程请求文件),就是要保证每个通过该站点返回到客户端(浏览器)的页面都追加一点东西(此次是追加一个JS),那么只有在HttpModule的EndRequest事件中或者在Global的Application_EndRequest事件中做文章了(beginRequest中也一样,只是开头和结尾的区别); 感谢sp1234大哥的解答,我问题中的输出内容改为追加内容会比较合适。 遇到我提出的问题之后,我已经想尽各种办法测试了(本机环境部署、服务器外网部署都测试过),总之就是【只有在原生chrome或双核浏览器的chrome模式下才有结果。】 然后我就新建了一个站点,只有一个默认的空页面,同样的方法,在任何浏览器都没有问题(理论上在EndRequest方法里输出任何数据都不应该有问题), 我就分析,既然本应该在任何浏览器都不应该出问题的为什么却在某些浏览器没有结果了呢?那么一定是在处理这个结果之前有地方对浏览器的返回做了处理, 之后在一个自定义HttpModule 发现在beginRequest中最后有这么一段:


 if (!context.Request.UserAgent.ToLower().Contains("konqueror") )
            {
                if (context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains("gzip"))
                {
                    context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress, true);
                    context.Response.AppendHeader("Content-encoding", "gzip");
                }
                else if (context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains("deflate"))
                {
                    context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress, true);
                    context.Response.AppendHeader("Content-encoding", "deflate");
                }
            }



以上这段是对hander的encoding进行处理, 于是我屏蔽此段,yes 没有错,任何浏览器都OK了;



 void context_EndRequest(object sender, System.EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            for (int i = 0; i < app.Context.Response.Cookies.Count; i++)
            {
                if (app.Context.Response.Cookies[i].Name.Equals("ASP.NET_SessionId"))
                {
                    app.Context.Response.Cookies[i].Domain = m_RootDomain;
                    break;
                }
                app.Context.Response.Write("我想输出的东西");
            }
        }


  • 打赏
  • 举报
回复
casino --> casini 在window8上的chrome会故意把你的桌面切换到恶心的metro去。而且chrome早已经背叛了几年前攻击人家adobe之类的插件时的信誓旦旦,现在不但google自己发明了好几款插件,而且chrome与许多其它浏览一样越来越不像是浏览器、而成为操作系统入侵劫持工具了。
  • 打赏
  • 举报
回复
我想你既然写“只有在原生chrome或双核浏览器的chrome模式下才有结果”,虽然你没有说,我估计你根本没经过IIS测试。整了个简易的 casino 然后直接使用 chrome 打开吧? 如果你使用 casino,那么应该以 ie 为唯一调试浏览器。
  • 打赏
  • 举报
回复
Application_EndRequest 向 “页面”输出? 什么意思?你的页面还没有输出html,就应该执行Applicaiton_EndRequest?那么你应该看看是不是IIS出现严重故障了,还高兴地去看页面干吗?
Andy__Huang 2013-09-24
  • 打赏
  • 举报
回复
就算是执行里面.cs的代码,也可以,但至少不应该再向页面输出.
Andy__Huang 2013-09-24
  • 打赏
  • 举报
回复
这是一个结束事件,按道理说应该是没有输出才合理.这里的结束是指向页面输出结束,但那些可以输出的浏览器可能对这个定义不准确.
jshi123 2013-09-24
  • 打赏
  • 举报
回复
在EndRequest中输出是写到html标记的外面去了,虽然是不合法的html写法,不过大多数浏览器都是支持的,IE/FireFox也没有问题。我测试的版本是: IE 9 FireFox 22.0 搜狗4.0
threenewbee 2013-09-24
  • 打赏
  • 举报
回复
尽量不要用Application_EndRequest,事实上任何我能想到的用途,都无需这个事件。
licai1210 2013-09-24
  • 打赏
  • 举报
回复
清楚缓存试试,只要是有浏览器可以,那和服务器端就没什么关系了

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧