zoukankan      html  css  js  c++  java
  • HttpContext rewritePath后中文乱码

    文章为转载

    由于种种原因,最近将服务器上部署的网站修改4.0框架。但悲剧的问题出现了,发现搜索中文的时候关键词都成乱码了。

    在网上查找相关资料得到几种相关解决方案如下:

    • 服务器打补丁server2008 打sp2补丁中文语言包
    • url中中文先通过Server.UrlEncode编码
    • 修改网站编码

    根据以上提示进行一步一步解决 检查服务器系统已经是sp2的中文系统,网站搜索是通过js跳转的无法进行Server.UrlEncode编码,修改网站编码比较麻烦而且有可能导致其他问题,所以以上方法都行不通。

    只能自己想办法了,自己添加一个简单测试页面 http://www.test.cn/test.aspx?kw=测试 页面输出QueryString时候发现输出的中文是正常的。再对搜索页面的地址不进行url重写的情况下访问测试,发现同样中文同样是正常的。于是初步确定是在URLRewriter中转发时候参数传递过程中出现问题。按照之前查到的使用Server.UrlEncode对参数进行编码。经过一番调试后终于是没有乱码了。

    修改代码RewriterUtils.cs 的RewriteUrl方法

    internal static void RewriteUrl(HttpContext context, string sendToUrl, out string sendToUrlLessQString, out string filePath)
    {
        if (context.Request.QueryString.Count > 0)
        {
            if (sendToUrl.Contains("?"))
            {
                sendToUrl = sendToUrl + "&" + context.Request.QueryString;
            }
            else
            {
                sendToUrl = sendToUrl + "?" + context.Request.QueryString;
            }
        }
        string queryString = string.Empty;
        sendToUrlLessQString = sendToUrl;
        int tempIndex = sendToUrl.IndexOf('?');
        if (tempIndex != -1)
        {
            sendToUrlLessQString = sendToUrl.Substring(0, tempIndex);
            queryString = sendToUrl.Substring(tempIndex + 1);
        }
        filePath = context.Server.MapPath(sendToUrlLessQString);
         
       //iis7 获取乱码问题
        var list = queryString.Split('&');
        var newQueryStr = string.Empty;
        for (int i = 0; i < list.Length; i++)
        {
            var arr = list[i].Split('=');
            if (arr.Length > 1)
            {
                newQueryStr = newQueryStr + arr[0] + "=" + context.Server.UrlEncode(arr[1]) + "&";
            }
            else
            {
                newQueryStr = newQueryStr + "&";
            }
        }
     
        context.RewritePath(sendToUrlLessQString, string.Empty, newQueryStr.TrimEnd('&'));
    }

      

    问题是解决了,不过这肯定是很笨的一种方法。先临时把问题解决,再寻找更好的办法了。希望遇到类似问题的提供意见,同时也希望遇到类似问题的人能够快速定位问题

  • 相关阅读:
    C#-黑客-数据库访问-字符串的攻击和防御
    C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看
    C#把datetime类型的日期转化成年月日或其他格式方法总结
    C#—类库、委托、is和as运算符、泛型集合
    C#-面向对象的三大特性——多态(虚方法与重写、抽象类、接口)
    C#-面向对象的三大特性——继承
    C#-面向对象——如何调用使用类 普通方法、静态方法的使用
    C#-面向对象的三大特性——封装(封装成员变量、封装成员方法)
    面向对象的封装、继承、多态
    如何在HTMl网页中插入百度地图
  • 原文地址:https://www.cnblogs.com/xuyufeng/p/4682453.html
Copyright © 2011-2022 走看看