技术 - ASP/.Net - 关于《SiteServer CMS 中 ajaxProxy 改进》升级到 SiteServer CMS 3.3 Beta 3 表单提交编码出错的问题

11
09 May.

关于《SiteServer CMS 中 ajaxProxy 改进》升级到 SiteServer CMS 3.3 Beta 3 表单提交编码出错的问题

最后更新: 2009/05/11  |  评论: 0  |  关键词: 编码  表单  错误  乱码  

SiteServer CMS 一个月前就升级到了 3.3 Beta 3,因为原来的后台结构有所变化,所以导致本站的留言和友情链接都无法使用,估计很多使用了我代码的朋友也会有这个问题

提交没有什么问题,可以是如果返回系统后台一看,全是乱码。很显然是编码的问题,今天仔细研究了一下,原来 SiteServer CMS 3.3 Beta 3 将 Ajax 地址中 inner 变成了 首字大写 Inner,从而导致了无法识别地址而采用了默认编码提交方式,从而产生了乱码。

其实这应该是我上次改进代码的疏忽,严重地址的时候没有过滤掉大小写,今天改了改,很简单,加个地址变成小写就可以了,以下是全部代码:

  1. <%@ Page Language="VB" AutoEventWireup="true"%>  
  2.  
  3. <%@ Import Namespace="System"%>  
  4.  
  5. <script runat="server">  
  6.     Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs)  
  7.         Dim CharSet As String = Request.QueryString("charset")  
  8.         If String.IsNullOrEmpty(CharSet) Then CharSet = "GB2312" 
  9.  
  10.         Dim Encode As Text.Encoding = Text.Encoding.GetEncoding(CharSet)  
  11.  
  12.         Dim Url As String = System.Web.HttpUtility.ParseQueryString(Request.Url.Query, Encode).Get("url").Trim  
  13.         If Url.Contains("?"Then 
  14.             Url &= "&isCrossSite=True" 
  15.         Else 
  16.             Url &= "?isCrossSite=True" 
  17.         End If 
  18.  
  19.         Dim Mothod As String = Request.HttpMethod.ToLower  
  20.  
  21.         Dim Result As String = "" 
  22.  
  23.         Try 
  24.             With New Net.WebClient  
  25.                 Dim Cookies As String = "" 
  26.                 If Request.Cookies IsNot Nothing Then 
  27.                     For Each Key As String In Request.Cookies.Keys  
  28.                         Cookies &= String.Format("{0}={1}; ", Key, Request.Cookies(Key).Value)  
  29.                     Next 
  30.                 End If 
  31.                 Cookies = Cookies.Trim  
  32.                 If Cookies.EndsWith(";"Then Cookies = Cookies.Substring(0, Cookies.Length - 1)  
  33.  
  34.                 .Headers.Add(Net.HttpRequestHeader.Cookie, Cookies)  
  35.  
  36.                 Dim retByte As Byte()  
  37.                 If Mothod <> "post" Then 
  38.                     retByte = .DownloadData(Url)  
  39.                     If retByte IsNot Nothing Then Result = Text.Encoding.UTF8.GetString(retByte)  
  40.                 Else 
  41.                     '表单提交的内容则进行编码转换,否则直接提交  
  42.                     Dim sUrl As String = Url.ToLower  
  43.                     If sUrl.Contains("/inner/comment/"Or sUrl.Contains("/inner/search/"Or sUrl.Contains("/inner/input/"Then 
  44.                         .Headers.Add(Net.HttpRequestHeader.ContentType, "application/x-www-form-urlencoded")  
  45.  
  46.                         Dim PostForm As New NameValueCollection  
  47.                         For Each Key As String In Request.Form.Keys  
  48.                             PostForm.Add(Key, HttpUtility.UrlEncode(Request.Form(Key), Encode))  
  49.                         Next 
  50.                         retByte = .UploadValues(Url, "POST", PostForm)  
  51.                         If retByte IsNot Nothing Then Result = Encode.GetString(retByte)  
  52.                     Else 
  53.                         retByte = .UploadValues(Url, "POST", Request.Form)  
  54.                         If retByte IsNot Nothing Then Result = Text.Encoding.Default.GetString(retByte)  
  55.                     End If 
  56.                 End If 
  57.  
  58.                 Cookies = .ResponseHeaders(Net.HttpResponseHeader.SetCookie)  
  59.  
  60.                 If Not String.IsNullOrEmpty(Cookies) Then 
  61.                     Cookies = Cookies.Replace(vbCrLf, ";")  
  62.                     For Each Cook As String In Cookies.Split(";")  
  63.                         If Cook.Contains("="Then 
  64.                             Dim cookieNameValue As String() = Cook.Split("=")  
  65.                             Response.Cookies.Set(New Web.HttpCookie(cookieNameValue(0).Trim, cookieNameValue(1).Trim))  
  66.                         End If 
  67.                     Next 
  68.                 End If 
  69.             End With 
  70.         Catch ex As Exception  
  71.             Result = String.Format("<p style=""color:red;text-align:center;"">服务器获取文件内容出错:{0}<br />网址:{1}<br />编码:{2}</p>", ex.Message, Url, CharSet)  
  72.         End Try 
  73.  
  74.         Response.Write(Result)  
  75.         Response.End()  
  76.     End Sub 
  77. </script> 

红色为修改部分,目前应该没有什么问题了。注意的是测试环境:分站编码 为 UTF-8;主站编码 为 GB2312

· 本文由 木炭 发布在《激情燃烧的木炭》 上,原文地址为:http://www.woodcoal.cn/technology/asp/2009511-370-519.html(转载请保留本信息、全文内容和链接)

发表评论

已经有 0 位朋友发表了对《关于《SiteServer CMS 中 ajaxProxy 改进》升级到 SiteServer CMS 3.3 Beta 3 表单提交编码出错的问题》的看法
 
登录名:  密码:   登录  注册
评论: 
User:
Contact:
验证码:  
  [Ctrl+Enter]

关于本文