title: Asp.net Google Charts SSL handler for GeoMap
body: <p>I am trying to view Google charts in a site using SSL.</p>
  
  <p>Google Charts do not support SSL so if we use the standard charts, we get warning messages.</p>
  
  <p>My plan is to create a ASHX handler that is co9ntained in the secure site that will retrieve the content from Google and serve this to the page the user is viewing.</p>
  
  <p>Using VS 2008 SP1 and the included web server, my idea works perfectly for both Firefox and IE 8  &amp; 9(Preview) and I am able to see my geomap displayed on my page as it should be. But my problem is when I publish to IIS7 the page using my handler to generate the geomap works in Firefox but not IE(every version).</p>
  
  <p>There are no errors anywhere or in any log files, but when i right click in IE in the area where the map should be displayed, I see the message in the context menu saying "movie not loaded"</p>
  
  <p>Below is the code from my handler and the aspx page.</p>
  
  <p>I have disabled compression in my web.config.</p>
  
  <p>Even in IE I am hitting all my break points and when I use the IE9 Developer tools, the web page is correctly generated with all the correct code, url's and references.</p>
  
  <p>If you have any better ways to accomplish this or how i can fix my problem, I will appreciate it.</p>
  
  <p>Thanks  </p>
  
  <p>Ian</p>
  
  <p><strong>Handler(ASHX)</strong></p>
  
  <pre><code>  public void ProcessRequest(HttpContext context)
      {
          String url = "http://charts.apis.google.com/jsapi";
  
          string query = context.Request.QueryString.ToString();
          if (!string.IsNullOrEmpty(query))
          {
              url = query;
          }
  
          HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(HttpUtility.UrlDecode(url)));
  
          request.UserAgent = context.Request.UserAgent;
          WebResponse response = request.GetResponse();
  
          string PageContent = string.Empty;
          StreamReader Reader;
  
          Stream webStream = response.GetResponseStream();
  
          string contentType = response.ContentType;
  
          context.Response.BufferOutput = true;
          context.Response.ContentType = contentType;
          context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
          context.Response.Cache.SetNoServerCaching();
          context.Response.Cache.SetMaxAge(System.TimeSpan.Zero);
  
                  string newUrl = IanLearning.Properties.Settings.Default.HandlerURL; //"https://localhost:444/googlesecurecharts.ashx?";
  
          if (response.ContentType.Contains("javascript"))
          {
              Reader = new StreamReader(webStream);
              PageContent = Reader.ReadToEnd();
  
              PageContent = PageContent.Replace("http://", newUrl + "http://");
              PageContent = PageContent.Replace("charts.apis.google.com", newUrl + "charts.apis.google.com");
              PageContent = PageContent.Replace(newUrl + "http://maps.google.com/maps/api/", "http://maps.google.com/maps/api/");
  
              context.Response.Write(PageContent);
          }
          else
          {
              {
                  byte[] bytes = ReadFully(webStream);
                  context.Response.BinaryWrite(bytes);
              }
          }
  
          context.Response.Flush();
          response.Close();
          webStream.Close();
          context.Response.End();
          context.ApplicationInstance.CompleteRequest();
      }
  </code></pre>
  
  <p><strong>ASPX Page</strong></p>
  
  <pre><code>&lt;%@ Page Title="" Language="C#" MasterPageFile="~/Site2.Master" AutoEventWireup="true"
      CodeBehind="googlechart.aspx.cs" Inherits="IanLearning.googlechart" %&gt;
  
  &lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"&gt;
  
  &lt;script type='text/javascript' src='~/googlesecurecharts.ashx?'&gt;&lt;/script&gt;
  &lt;script type='text/javascript'&gt;
      google.load('visualization', '1', { 'packages': ['geomap'] });
      google.setOnLoadCallback(drawMap);
  
      var geomap;
  
      function drawMap() {
          var data = new google.visualization.DataTable();
          data.addRows(6);
          data.addColumn('string', 'City');
          data.addColumn('number', 'Sales');
          data.setValue(0, 0, 'ZA');
          data.setValue(0, 1, 200);
          data.setValue(1, 0, 'US');
          data.setValue(1, 1, 300);
          data.setValue(2, 0, 'BR');
          data.setValue(2, 1, 400);
          data.setValue(3, 0, 'CN');
          data.setValue(3, 1, 500);
          data.setValue(4, 0, 'IN');
          data.setValue(4, 1, 600);
          data.setValue(5, 0, 'ZW');
          data.setValue(5, 1, 700);
  
          var options = {};
          options['region'] = 'world';
          options['dataMode'] = 'regions';
          options['showZoomOut'] = false;
  
          var container = document.getElementById('map_canvas');
          geomap = new google.visualization.GeoMap(container);
  
          google.visualization.events.addListener(
          geomap, 'regionClick', function(e) {
              drillDown(e['region']);
          });
  
          geomap.draw(data, options);
      };
  
      function drillDown(regionData) {
        alert(regionData);
      }
  &lt;/script&gt;
  
  &lt;/asp:Content&gt;
  &lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"&gt;
      &lt;div id='map_canvas'&gt;
      &lt;/div&gt;
  &lt;/asp:Content&gt;
  </code></pre>