如何在WCF服务中创建动态图像并将其发送回WCF中的调用者?

时间:2010-12-09 14:43:17

标签: c# wcf memorystream dynamic-image-generation

我有一个ASP.NET页面,我正在渲染一些HTML标记,其中包含由另一个asp.net页面生成的条形码图像

 <div id='divDynamic'>
   <h1>Some content</h1>
   <img src='barcode.aspx?mode=something' />
 </div>

在barcode.aspx.cs中,我有:

 protected void Page_Load(object sender, EventArgs e)
 {
    Response.CacheControl = "no-cache"; 
    Response.AddHeader("Pragma", "no-cache");
    Response.Expires = -1 ; 
    Response.Buffer = false;
    Response.ContentType = "image/JPEG";
    MemoryStream ms = new MemoryStream();    

    System.Drawing.Image objBitmap = GenCode128.Code128Rendering.MakeBarcodeImage(Request.QueryString["mode"] + "", 2,false );
    objBitmap.Save(ms ,ImageFormat.Bmp); 

    Response.BinaryWrite(ms.GetBuffer());
    Response.End();
}

我需要在许多类似网站中使用相同的功能。所以现在我正在尝试将其转换为WCF服务,其中将生成div“divDynamic”的标记并将其发送回客户端(asp.net网站)。我的服务有一个返回类型字符串的方法,它将返回HTMLMarkup,如下所示

 public string GetUSPSLabelMarkup()
 {
        StringBuilder strHtml = new StringBuilder();
        strHtml.Append("<h1>Some content</h1>");
        // How do I have the barcode image here?

        return strHtml.ToString();

    }

我想知道如何在我的服务中使用上述方法中的图像生成部分?我相信Response.BinaryWrite不应该在这里工作。

2 个答案:

答案 0 :(得分:2)

如果你要发回HTML,这意味着消费者也可以理解IMG标签,那你为什么不发送这个:

 strHtml.Append("<h1>Some content</h1>");
 strHtml.Append("<img src='barcode.aspx?mode=something' />");

这有什么问题?

PS:你可以像这样简化你的流媒体代码(不需要创建一个内存流和一个慢慢杀死服务器堆的字节数组):

protected void Page_Load(object sender, EventArgs e)
 {
    Response.ContentType = "image/JPEG";
    System.Drawing.Image objBitmap = GenCode128.Code128Rendering.MakeBarcodeImage(Request.QueryString["mode"] + "", 2,false );
    objBitmap.Save(Response.OutputStream, ImageFormat.Bmp); 
}

另外,请确保contentType和ImageFormat之间保持一致(您在一个上声明JPEG,在另一个上声明BMP)。

答案 1 :(得分:1)

我认为那里存在概念上的错误。

即使在WCF中,您仍然会有两个单独的呼叫:

  • 客户端使用<img>引用
  • 加载HTML标记
  • 客户端从服务器
  • 加载二进制图像数据

因此,您在WCF服务上将有两种方法:string GetUSPSLabelMarkup()byte() GetUSPSLabelImageData()