我有自定义的httphandler,它调用wcf服务。按服务返回Stream
[OperationContract]
Stream GetMyStream(int width, int height);
我从图像标记中调用我的aspx页面中的http处理程序:
<asp:Image ID="imgStream" runat="server" ImageUrl="MyStreamHandler.ashx" Visible="true" />
在我的处理程序中,我有一个对WCF服务的引用,我正在调用如下操作:
MyServiceClient tcpClient = new MyServiceClient();
Image img = Image.FromStream(tcpClient.GetMyStream(30,100));
我在我的服务中使用NetTcp绑定。现在,我可以通过jquery ajax在我的aspx页面中调用http处理程序,并在图像标记中显示流,以避免页面上的回发。
感谢。
答案 0 :(得分:2)
我认为您不需要使用ajax,您可以使用下面的内容并添加图像引用以指向src中的处理程序。
请注意图片类型需要与您的图片相匹配。
public class MyStreamHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
MyServiceClient tcpClient = new MyServiceClient();
Image img = Image.FromStream(tcpClient.GetMyStream(30,100));
img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
img.Dispose()
}
public bool IsReusable {
get {
return false;
}
}
}
答案 1 :(得分:2)
您应该使用IIS的本机文件处理程序来返回图像文件的内容,而不是通过托管代码运行流。虽然hutchonoid的答案有效,但我想指出最终结果的可扩展性可能较低,因为它将流写入内存中的Image对象,然后通过响应流将其发回。
它可能对大多数工作负载都很好,只是说它实际上不太优雅的解决方案,即使它更难实现。如果有的话,如果它上传到某个CDN然后返回到该资源的图像路径而不是通过httphandler提供服务,那么您的服务可能是最好的。