C# 如何调用aspx页面并让其返回图像?

C# 如何调用aspx页面并让其返回图像?,c#,asp.net,image,C#,Asp.net,Image,*******根据评论编辑新代码示例的帖子******* 所以,说清楚点,我有两个文件。第一个文件名为FinalImage.aspx,下面是该页面的代码: <html> <body> <img src="newpage.aspx" /> </body> </html> 根据Jason在下面评论中的示例,newpage.aspx具有以下代码: <%@ Page Language="C#" %> <

*******根据评论编辑新代码示例的帖子*******

所以,说清楚点,我有两个文件。第一个文件名为FinalImage.aspx,下面是该页面的代码:

<html>
  <body>
    <img src="newpage.aspx" />
  </body>
</html>

根据Jason在下面评论中的示例,newpage.aspx具有以下代码:

<%@ Page Language="C#" %>

<script runat="server" language="c#">

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "image/png";
        byte[] data = System.IO.File.ReadAllBytes("http://mystatus.skype.com/smallclassic/eric-greenberg");

        Response.OutputStream.Write(data, 0, data.Length);
        Response.OutputStream.Flush(); 
        Response.End();
    }

</script>

受保护的无效页面加载(对象发送方、事件参数e)
{
Response.ContentType=“image/png”;
byte[]data=System.IO.File.ReadAllBytes(“http://mystatus.skype.com/smallclassic/eric-greenberg");
Response.OutputStream.Write(数据,0,数据.长度);
Response.OutputStream.Flush();
Response.End();
}
如果我调用FinalImage.aspx,我会看到一个损坏的图像

如果我直接调用newpage.aspx,我会得到一个“URI格式不受支持错误”

不过我觉得很接近


此外,对于刚刚阅读本文的任何人来说,需要使用此解决方案来回避这样一个事实,即skype的skype按钮没有https选项,这些按钮可以告诉skype用户的状态。创建此代理页面将允许此操作,而不会在浏览器中引起“混合”安全警报。

您需要将内容类型设置为“image/jpg”或相关图像MIME

            Response.ContentType = "Image/jpg";

为了扩展Aliostad的答案,这里有一个片段可能会帮助您:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "image/jpeg";

    var data = // .... get the content of the images as bytes. e.g. File.ReadAllBytes("path to image");

    Response.OutputStream.Write(data, 0, data.Length);
    Response.OutputStream.Flush(); // Not sure if needed, but doesn't hurt to have it.
    Response.End();
}
不确定上面的内容是否100%正确,但我最近在一个项目中使用了类似的方法从aspx页面返回图像。不幸的是,我现在手头上没有这段代码。

要进一步扩展(根据Jason的回答),您将不希望将响应流读入StreamReader(因为结果不是文本)。您可以做什么使用aspx页面作为需要它的页面上图像的src。例如:

<html>
    <image src="~/MyDynamicImage.aspx"/>
</html>


由于MyDynamicImage.aspx返回一个图像作为其响应,因此可以将其视为一个图像(例如,就像您指向一个static.jpg一样)。

您可以使用上面在实现IHttpHandler的类的ProcessRequest方法中发布的代码。这比使用页面更轻量级,因为这样可以避免页面生命周期


这里有一个例子。它比您需要的内容要复杂一点,但您应该能够根据自己的需要修改它。

因此,这里是最后的工作代码:感谢大家帮助您一点一点地跟踪它(可以说…)


受保护的无效页面加载(对象发送方、事件参数e)
{
Response.ContentType=“image/png”;
System.Net.WebClient wc=新系统.Net.WebClient();
字节[]数据=wc.DownloadData(“http://mystatus.skype.com/smallclassic/eric-greenberg");
Response.OutputStream.Write(数据,0,数据.长度);
Response.OutputStream.Flush();
Response.End();
}

请参阅更新。在页面加载中。您不需要任何视觉效果和控件。只有code.OK-到目前为止,我有一个名为“FinalImage.aspx”的文件,其中只有Html标记和一个图像标记,src设置为newpage.aspx.crap-没有用注释结束:newpage.aspx中几乎有您的示例:受保护的无效页面加载(对象发送方,事件参数e){Response.ContentType=“image/png”;byte[]data=System.IO.File.ReadAllBytes(“);Response.OutputStream.Write(data,0,data.Length);Response.OutputStream.Flush();Response.End();}你知道吗?我要编辑原始帖子,看看是否有效。请稍候。我不认为
文件。ReadAllBytes
支持URI格式,它只适用于本地文件。你需要创建一个WebRequest并下载字节。
<%@ Page Language="C#" %>

<script runat="server" language="c#">
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "image/png";

        System.Net.WebClient wc =  new System.Net.WebClient();

        byte[] data = wc.DownloadData("http://mystatus.skype.com/smallclassic/eric-greenberg");
        Response.OutputStream.Write(data, 0, data.Length);
        Response.OutputStream.Flush(); 
        Response.End();
    }
</script>