某墙尼妹,用个Response.Filter来解决StackExchange.Exceptional中google cdn的问题

某墙墙了古古路,一些开源的东东里用了古古路CDN,比如Exceptional,Opserver ,导致服务要么慢要么用不了

必须要替换之

Exceptional就只要用Response.Filter替换个页面了,因为自己维护个版本还要定期合并什么的,操心

 internal class ResponseStream : MemoryStream
        {

            #region ctor

            private Stream Output { get; set; }
            public HttpContextBase Context { get; set; }

            /// <summary>
            /// 页面输出的Stream Buffer
            /// </summary>
            public List<byte> BytesArray { get; set; }

            public ResponseStream(HttpContextBase context)
            {
                Context = context;
                Output = context.Response.Filter;
                context.Response.BufferOutput = true;
                context.Response.Buffer = true;
                BytesArray = new List<byte>();
            }

            #endregion


            public override void Write(byte[] buffer, int offset, int count)
            {
                if (Context.Response.ContentType != "text/html")
                {
                    Output.Write(buffer, offset, count);
                    return;
                }
                BytesArray.AddRange(buffer);
            }

            public override void Close()
            {
                if (BytesArray.Count > 0)
                    CloseByReplace();
                Output.Close();
                base.Close();
            }

            private void CloseByReplace()
            {
                var html = Encoding.UTF8.GetString(BytesArray.ToArray(), 0, BytesArray.Count);
                var sb = new StringBuilder(html);

                sb.Replace("//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js", "http://libs.baidu.com/jquery/1.7.2/jquery.min.js");
                var outputBytes = Encoding.UTF8.GetBytes(sb.ToString());
                Output.Write(outputBytes, 0, outputBytes.Length);
            }


        }

Action对应的改为:

        public ActionResult Exceptions()
        {
            var context = System.Web.HttpContext.Current;
            context.Response.Filter = new ResponseStream(HttpContext);
            var page = new HandlerFactory().GetHandler(context, Request.RequestType, Request.Url.ToString(),
                Request.PathInfo);
            page.ProcessRequest(context);

            return null;
        }

 

posted @ 2014-08-01 12:23 重典 阅读(...) 评论(...) 编辑 收藏