正如我們所知silverlight5有能力獲取pageElement的視覺效果,因此我們可以將其打印或保存爲pictrue.but如果您的MapTilesSource uri與Silverlight應用程序主機站點位於不同的域中,則可以沒有得到BingMapControl的視覺效果,因爲「跨域問題」,clr會拋出一個System.Security.SecurityException異常。 爲避免此問題,我在silverlight主機站點中添加了一個Proxy aspx頁面,該頁面可以將bingMap TileImage請求發送到遠程MapTilesService。 這裏是TileSource我的客戶類繼承:Silverlight bingMapContril使用LocalProxyPage下載MapTiles極其緩慢
public class GoogleTileSource : TileSource
{
public GoogleTileSource()
: base("http://mt{0}.google.cn/vt/lyrs={1}@180000000&hl=zh-CN&gl=cn&z={2}&x={3}&y={4}")
{
this.Type = GoogleTileType.Hybrid;
}
public override Uri GetUri(int x, int y, int zoomLevel)
{
string TargetUrl = string.Format(this.UriFormat, this.Server, (char)this.Type, zoomLevel, x, y);
return new Uri(string.Format(http://localhost:52879/MapTilesServerProxy.aspx + "?sourceUrl={0}", TargetUrl));
//return new Uri(string.Format(this.UriFormat, this.Server, (char)this.Type, zoomLevel, x, y));
}
public int Server
{
get;
set;
}
public GoogleTileType Type
{
get;
set;
}
}
這裏是我的代理頁面代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MapTilesServerProxy.aspx.cs" Inherits="AeroZH.Web.MapTilesServerProxy" %>
<%@ Import Namespace=System.Net %>
<%@ Import Namespace=System.IO %>
<%@ Import Namespace=System.Diagnostics %>
<script runat="server">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ProxyRequest();
}
private void ProxyRequest()
{
try
{
string url = "";
url = this.Page.Request.Url.AbsoluteUri.Split(new string[] { "?sourceUrl=" }, StringSplitOptions.RemoveEmptyEntries)[1];
Debug.WriteLine("url:" + url);
Debug.WriteLine(url + "——requestTime:" + System.DateTime.Now);
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(url);
loHttp.Timeout = 10000; // 10 secs
loHttp.UserAgent = "Web Client";
HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();
Debug.WriteLine(url + "——responseTime:" + System.DateTime.Now);
using (Stream inputStream = loWebResponse.GetResponseStream())
{
byte[] buffer = new byte[4096 * 100];
int bytesRead;
do
{
bytesRead = inputStream.Read(buffer, 0, buffer.Length);
} while (bytesRead != 0);
Response.BinaryWrite(buffer);
Response.End();
}
loWebResponse.Close();
if (loHttp != null)
loHttp.Abort();
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
}
}
這項工作後,bingMapcontrol成功使其圖像請求以爲代理頁面,以及ProxyPage的要求得到響應表單的遠程服務器也是成功的,但只有少數mapTiles顯示在地圖上。 我使用debug.write跟蹤響應狀態,幾乎每個請求都有正確的響應,我不知道爲什麼只有少數mapTiles顯示在地圖中。