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#):
- <%@ Page Language="C#" AutoEventWireup="true" %>
- <%@ Import Namespace=System.Net %>
- <%@ Import Namespace=System.IO %>
- <%@ Import Namespace=System.Text %>
- <%@ Import Namespace=System.Collections %>
- <%@ Import Namespace=System.Collections.Specialized %>
- <script runat="server">
- protected override void OnLoad(EventArgs e)
- {
- base.OnLoad(e);
- string charset = Page.Request.QueryString["charset"];
- string url = Page.Request.QueryString["url"];
- Encoding encoding = Encoding.GetEncoding(charset);
- if (url.IndexOf("?") == -1)
- {
- url += "?isCrossSite=True";
- }
- else
- {
- url += "&isCrossSite=True";
- }
- this.Page.Response.Write(TransferHtmlPage(encoding, url));
- }
- public string TransferHtmlPage(Encoding encoding, string url)
- {
- string result = string.Empty;
- try
- {
- WebClient webClient = new WebClient();
- webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
- NameValueCollection attributes = new NameValueCollection();
- foreach (string key in base.Request.Form.Keys)
- {
- attributes.Add(key, HttpUtility.UrlEncode(base.Request.Form[key], encoding));
- }
- byte[] responseData = webClient.UploadValues(url, "POST", attributes);
- result = encoding.GetString(responseData);
- }
- catch (Exception ex)
- {
- result = string.Format(@"<p style='color:red;text-align:center;'>服务器获取文件内容出错:{0}<br />网址:{1}<br />编码:{2}</p>", ex.Message, url, encoding.EncodingName);
- }
- return result;
- }
- </script>
改进版本(VB.Net):
- <%@ Page Language="VB" AutoEventWireup="true"%>
- <%@ Import Namespace="System"%>
- <script runat="server">
- Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
- Dim CharSet As String = Request.QueryString("charset")
- If String.IsNullOrEmpty(CharSet) Then CharSet = "GB2312"
- Dim Encode As Text.Encoding = Text.Encoding.GetEncoding(CharSet)
- Dim Url As String = System.Web.HttpUtility.ParseQueryString(Request.Url.Query, Encode).Get("url").Trim
- If Url.Contains("?") Then
- Url &= "&isCrossSite=True"
- Else
- Url &= "?isCrossSite=True"
- End If
- Dim Mothod As String = Request.HttpMethod.ToLower
- Dim Result As String = ""
- Try
- With New Net.WebClient
- Dim Cookies As String = ""
- If Request.Cookies IsNot Nothing Then
- For Each Key As String In Request.Cookies.Keys
- Cookies &= String.Format("{0}={1}; ", Key, Request.Cookies(Key).Value)
- Next
- End If
- Cookies = Cookies.Trim
- If Cookies.EndsWith(";") Then Cookies = Cookies.Substring(0, Cookies.Length - 1)
- .Headers.Add(Net.HttpRequestHeader.Cookie, Cookies)
- Dim retByte As Byte()
- If Mothod <> "post" Then
- retByte = .DownloadData(Url)
- If retByte IsNot Nothing Then Result = Text.Encoding.UTF8.GetString(retByte)
- Else
- '表单提交的内容则进行编码转换,否则直接提交
- If Url.Contains("/inner/comment/") Or Url.Contains("/inner/search/") Or Url.Contains("/inner/input/") Then
- .Headers.Add(Net.HttpRequestHeader.ContentType, "application/x-www-form-urlencoded")
- Dim PostForm As New NameValueCollection
- For Each Key As String In Request.Form.Keys
- PostForm.Add(Key, HttpUtility.UrlEncode(Request.Form(Key), Encode))
- Next
- retByte = .UploadValues(Url, "POST", PostForm)
- If retByte IsNot Nothing Then Result = Encode.GetString(retByte)
- Else
- retByte = .UploadValues(Url, "POST", Request.Form)
- If retByte IsNot Nothing Then Result = Text.Encoding.Default.GetString(retByte)
- End If
- End If
- Cookies = .ResponseHeaders(Net.HttpResponseHeader.SetCookie)
- If Not String.IsNullOrEmpty(Cookies) Then
- Cookies = Cookies.Replace(vbCrLf, ";")
- For Each Cook As String In Cookies.Split(";")
- If Cook.Contains("=") Then
- Dim cookieNameValue As String() = Cook.Split("=")
- Response.Cookies.Set(New Web.HttpCookie(cookieNameValue(0).Trim, cookieNameValue(1).Trim))
- End If
- Next
- End If
- End With
- Catch ex As Exception
- Result = String.Format("<p style=""color:red;text-align:center;"">服务器获取文件内容出错:{0}<br />网址:{1}<br />编码:{2}</p>", ex.Message, Url, CharSet)
- End Try
- Response.Write(Result)
- Response.End()
- End Sub
- </script>
· 本文由 木炭 发布在《激情燃烧的木炭》 上,原文地址为:http://www.woodcoal.cn/technology/asp/2009221-3500-513.html(转载请保留本信息、全文内容和链接)
关于本文
- 作者:
- 来源:
- 时间:2009/02/21
- 关键词:ajax proxy 编码 分站 修正 域名
- 栏 目:ASP/.Net
- 上一篇:某 .Net 广告系统的授权码算法
- 下一篇:ASP 中 MD5 函数
发表评论