技术 - ASP/.Net - SiteServer CMS 中 ajaxProxy 改进

21
09 Feb.

SiteServer CMS 中 ajaxProxy 改进

最后更新: 2009/02/28  |  评论: 0  |  关键词: ajax  proxy  编码  分站  修正  域名  

SiteServer CMS 强大的分站功能,可以是任何站点自定义域名,并无缝的集成在一起,我很欣赏这个功能,但是由于浏览器的安全问题,所有浏览器都禁止了 ajax 进行跨站访问,所以当您的分站域名和主域名不一致时,就会出现错误

为了解决此问题,官方使用了一个 ajax 代理的文件,从而有效的解决了跨站访问的问题。但是由于系统使用环境的千差万别,导致官方的 ajaxProxy 文件并不一定能适应所有环境,因此我对文件进行了些改造和修正,基本上大部分功能已经可以使用了。

个别的如新版增加的 stl:star 和 stl:digg 还不行,因为这个可能是系统设计上的问题,因为已经编译的 DLL 为无法修改,所以修正不了,目前只能从外部出手

另外自定义表单本身生成的脚本是存在错误的,所以也无法使用本程序来修正。

使用方法,在分站根目录新建一个 ajaxProxy.aspx 的文本文件,将本站对应代码复制进去,保存就可以使用了。

目前我们提供两个代码,一个是官方的用 C# 编写,一个是本人的用  VB.Net 编写的。请根据实际情况使用。

测试环境:SiteServer CMS 3.3 beta/3.2; 主站编码 GB2312/分站编码 UTF-8

官方版本(C#):

  1. <%@ Page Language="C#" AutoEventWireup="true" %>  
  2. <%@ Import Namespace=System.Net %>  
  3. <%@ Import Namespace=System.IO %>  
  4. <%@ Import Namespace=System.Text %>  
  5. <%@ Import Namespace=System.Collections %>  
  6. <%@ Import Namespace=System.Collections.Specialized %>  
  7.  
  8. <script runat="server">  
  9.     protected override void OnLoad(EventArgs e)  
  10.     {  
  11.         base.OnLoad(e);  
  12.  
  13.         string charset = Page.Request.QueryString["charset"];  
  14.         string url = Page.Request.QueryString["url"];  
  15.         Encoding encoding = Encoding.GetEncoding(charset);  
  16.         if (url.IndexOf("?") == -1)  
  17.         {  
  18.             url += "?isCrossSite=True";  
  19.         }  
  20.         else 
  21.         {  
  22.             url += "&isCrossSite=True";  
  23.         }  
  24.         this.Page.Response.Write(TransferHtmlPage(encoding, url));  
  25.     }  
  26.       
  27.     public string TransferHtmlPage(Encoding encoding, string url)  
  28.     {  
  29.         string result = string.Empty;  
  30.         try 
  31.         {  
  32.             WebClient webClient = new WebClient();  
  33.             webClient.Headers.Add("Content-Type""application/x-www-form-urlencoded");  
  34.               
  35.             NameValueCollection attributes = new NameValueCollection();  
  36.             foreach (string key in base.Request.Form.Keys)  
  37.             {  
  38.                 attributes.Add(key, HttpUtility.UrlEncode(base.Request.Form[key], encoding));  
  39.             }  
  40.  
  41.             byte[] responseData = webClient.UploadValues(url, "POST", attributes);  
  42.             result = encoding.GetString(responseData);  
  43.         }  
  44.         catch (Exception ex)  
  45.         {  
  46.             result = string.Format(@"<p style='color:red;text-align:center;'>服务器获取文件内容出错:{0}<br />网址:{1}<br />编码:{2}</p>", ex.Message, url, encoding.EncodingName);  
  47.         }  
  48.  
  49.         return result;  
  50.     }  
  51.  
  52. </script> 

改进版本(VB.Net):

  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.                     If Url.Contains("/inner/comment/"Or Url.Contains("/inner/search/"Or Url.Contains("/inner/input/"Then 
  43.                         .Headers.Add(Net.HttpRequestHeader.ContentType, "application/x-www-form-urlencoded")  
  44.                           
  45.                         Dim PostForm As New NameValueCollection  
  46.                         For Each Key As String In Request.Form.Keys  
  47.                             PostForm.Add(Key, HttpUtility.UrlEncode(Request.Form(Key), Encode))  
  48.                         Next 
  49.                         retByte = .UploadValues(Url, "POST", PostForm)  
  50.                         If retByte IsNot Nothing Then Result = Encode.GetString(retByte)  
  51.                     Else 
  52.                         retByte = .UploadValues(Url, "POST", Request.Form)  
  53.                         If retByte IsNot Nothing Then Result = Text.Encoding.Default.GetString(retByte)  
  54.                     End If 
  55.                 End If 
  56.                   
  57.                 Cookies = .ResponseHeaders(Net.HttpResponseHeader.SetCookie)  
  58.  
  59.                 If Not String.IsNullOrEmpty(Cookies) Then 
  60.                     Cookies = Cookies.Replace(vbCrLf, ";")  
  61.                     For Each Cook As String In Cookies.Split(";")  
  62.                         If Cook.Contains("="Then 
  63.                             Dim cookieNameValue As String() = Cook.Split("=")  
  64.                             Response.Cookies.Set(New Web.HttpCookie(cookieNameValue(0).Trim, cookieNameValue(1).Trim))  
  65.                         End If 
  66.                     Next 
  67.                 End If 
  68.             End With 
  69.         Catch ex As Exception  
  70.             Result = String.Format("<p style=""color:red;text-align:center;"">服务器获取文件内容出错:{0}<br />网址:{1}<br />编码:{2}</p>", ex.Message, Url, CharSet)  
  71.         End Try 
  72.           
  73.         Response.Write(Result)  
  74.         Response.End()  
  75.     End Sub 
  76. </script> 

 

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

发表评论

已经有 0 位朋友发表了对《SiteServer CMS 中 ajaxProxy 改进》的看法
 
登录名:  密码:   登录  注册
评论: 
User:
Contact:
验证码:  
  [Ctrl+Enter]

关于本文