2015-07-22 87 views
0

正如我們所知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顯示在地圖中。

回答

0

首先,在Bing地圖中使用Google地圖磁貼違反Bing地圖和Google地圖使用條款的使用條款。其次,Bing地圖Silverlight控件即將結束生命。文檔已經離線,並且在控制被禁用之前不久。沒有新的發展應該與它一起。此外,幾年前,Silverlight的生命週期結束了。