Silverlight bingMapContril使用LocalproxyPage来下载MapTiles非常慢

时间:2015-07-22 07:32:45

标签: silverlight-4.0 bing-maps

我们知道silverlight5能够获取pageElement的视觉效果,因此我们可以将它们打印或保存为pictrue。但是如果您的MapTilesSource uri位于与Silverlight应用程序主机站点不同的域中,则无法获取BingMapControl&#39 ; s视觉,因为"跨域问题",clr会抛出System.Security.SecurityException。 为了避免这个问题,我在silverlight主机站点中添加了一个Proxy aspx页面,该页面可以将bingMap TileImage请求发送到远程MapTilesService。 这是我的客户类继承自TileSource:

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在地图中显示。

1 个答案:

答案 0 :(得分:0)

首先,在Bing地图中使用Google地图图块违反了Bing地图和Google地图使用条款的使用条款。

其次,Bing Maps Silverlight控件即将结束。文档已经脱机,并且在禁用控件之前不久。不应该有新的发展。此外,几年前宣布Silverlight的生命终结。