2011-08-25 52 views
3

我被通过POST制作WebRequest获得来自谷歌图表的图像。显示图像从WebRequest的

我遇到的问题是显示由谷歌返回的图像。

我可以小提琴手看到,对于图像的请求,并在响应返回的图像时,我做的:

var response = request.GetResponse(); 
从这里

但是我似乎不能够输出图片来自我的控制器。

下面是我在做什么现在:

using (var dataStream = response.GetResponseStream()) 
      { 
       if (dataStream == null) return; 

       using (var reader = new StreamReader(dataStream)) 
       { 
        byte[] dataBytes = Encoding.UTF8.GetBytes(reader.ReadToEnd()); 
        Response.ContentType = "image/png"; 
        Response.BinaryWrite(dataBytes); 
       } 
      } 

在浏览器窗口中显示的错误消息是:

无法显示图像“[路径图片]”,因为它包含 错误。

回答

3

尝试使用WebClient,这将简化代码:

public ActionResult MyChart() 
{ 
    using (var client = new WebClient()) 
    { 
     var data = client.DownloadData("http://......"); 

     // TODO: the MIME type might need adjustment 
     return File(data, "image/png", "chart.png"); 
    } 
} 

,或者如果你需要使用POST请求,并发送一些值,用UploadValues方法:

public ActionResult MyChart() 
{ 
    using (var client = new WebClient()) 
    { 
     var request = new NameValueCollection 
     { 
      { "foo", "foo value" }, 
      { "bar", "bar value" }, 
     }; 
     var data = client.UploadValues("http://......", request); 

     // TODO: the MIME type might need adjustment 
     return File(data, "image/png", "chart.png"); 
    } 
} 

和然后在视图中:

<img src="@Url.Action("MyChart", "SomeController")" alt="chart" /> 

或者如果该URL是静态的,可以使用GET请求,你可以直接将其包含在你的观点达成(你不需要在这种情况下,控制器动作):

<img src="http://......" alt="chart" /> 
+0

感谢达林。我应该提到,我做这个作为一个POST请求,因为传递到谷歌的大量数据。 DownloadData是否可以在Http Post上运行? –

+0

@Jamie迪克森,请参阅我的更新和'UploadValues'方法的使用。 –

+0

太棒了。谢谢Darin。这简化了我的代码堆。 –