在C#代理中从Web服务器读取图像

我正在尝试编写一个代理,它从一个服务器读取一个图像并将其返回给提供的HttpContext,但我只是回到了字符流。

我正在尝试以下方面:

WebRequest req = WebRequest.Create(image); WebResponse resp = req.GetResponse(); Stream stream = resp.GetResponseStream(); StreamReader sr = new StreamReader(stream); StreamWriter sw = new StreamWriter (context.Response.OutputStream); sw.Write (sr.ReadToEnd()); 

但正如我之前提到的,这只是回应文本。

我该怎么说它是一张图片?

编辑:我正在img标记的source属性的网页中访问它。 将内容类型设置为application / octet-stream提示保存文件并将其设置为image / jpeg只响应文件名。 我想要的是调用页面返回和显示的图像。

由于您使用的是二进制文件,因此您不想使用StreamReader ,它是一个文本阅读器!

现在,假设您已正确设置内容类型,您应该只使用响应流:

 const int BUFFER_SIZE = 1024 * 1024; var req = WebRequest.Create(imageUrl); using (var resp = req.GetResponse()) { using (var stream = resp.GetResponseStream()) { var bytes = new byte[BUFFER_SIZE]; while (true) { var n = stream.Read(bytes, 0, BUFFER_SIZE); if (n == 0) { break; } context.Response.OutputStream.Write(bytes, 0, n); } } } 

我想您需要检查WebResponse请求返回的ContentType 。

  if (resp.ContentType.StartsWith("image/")) { // Do your stuff } 

您需要在响应中设置内容类型。 这是一段代码,它会做到这一点:

 // specify that the response is a JPEG // Also could use "image/GIF" or "image/PNG" depending on what you're // getting from the server Response.ContentType = "image/JPEG"; 

我目前在应用程序中使用它。 内容URL作为查询字符串值(图像的URL)传入。

 try { if (ContentUrl != "") { string imgExtension = ContentUrl.Substring(ContentUrl.Length - 3, 3); switch (imgExtension) { case "": //image/bmp Response.ContentType = "image/bmp"; break; case "jpg": //image/jpeg Response.ContentType = "image/jpeg"; break; case "gif": //image/gif Response.ContentType = "image/gif"; break; default: Response.ContentType = "image/jpeg"; break; } if (!ContentUrl.StartsWith("http")) Response.BinaryWrite(new byte[] { 0 }); WebClient wc = new WebClient(); wc.Credentials = System.Net.CredentialCache.DefaultCredentials; Byte[] result; result = wc.DownloadData(ContentUrl); Response.BinaryWrite(result); } } catch (Exception ex) { Utility.WriteEventError(Utility.EVENTLOG_SOURCE, string.Format("ImageProxy Error... Url: {0}, Exception: {1}", ContentUrl, ex.ToString())); } finally { Response.End(); }