代码改变世界

使用ASP.Net创建代理实现Javascript跨域访问

2011-06-21 16:46  贼寇在何方  阅读(726)  评论(0编辑  收藏  举报

这段时间在做一个带电子地图的系统,调用的第三方的API
无奈这个API比较老,还没有解决跨域访问的问题
现在只好自己写一个代理实现

1.在网站中添加一个一般处理程序(ashx)

<%@ WebHandler Language="C#" Class="WebProxy"%>

using System;
using System.IO;
using System.Net;
using System.Web;

publicclass WebProxy : IHttpHandler
{
publicvoid ProcessRequest(HttpContext context)
{
// 需要通过代理访问的站点URL
var url ="http://www.jxmap.gov.cn/emap/";

// 原始URL
var curl = context.Request.Url.AbsoluteUri;

// 查询信息放在原始URL的问号后面
var query = curl.Substring(curl.IndexOf("?") +1);

try
{
// 代理访问站点
var request = (HttpWebRequest)WebRequest.Create(url + query);
var response
= (HttpWebResponse)request.GetResponse();

// 读入代理访问站点的Stream
var stream = response.GetResponseStream();
using (var ms =new MemoryStream())
{
var buffer
=newbyte[1024];
int i = stream.Read(buffer, 0, buffer.Length);
while (i >0)
{
ms.Write(buffer,
0, i);
i
= stream.Read(buffer, 0, buffer.Length);
}

// 以二进制方式写入Response
context.Response.BinaryWrite(ms.ToArray());
}
response.Close();
}
catch
{
// 拦截404等偶发性异常
}
}

publicbool IsReusable
{
get
{
returnfalse;
}
}
}

2. 更改JS访问的URL
把JS访问的URL,比如这里是"http://www.jxmap.gov.cn/emap"
改成代理的URL,比如"http://www.somewhere.com/WebProxy.ashx?"
最后的问号是为了便于分割查询字符串

3. 测试下,终于可以在不弹警告的状态下,调出嘉兴地图网的数据了