Как создать динамический образ в службе WCF и отправить его обратно вызывающей стороне в WCF? - PullRequest
1 голос
/ 09 декабря 2010

У меня есть страница 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 ]

2 голосов
/ 09 декабря 2010

Если вы отправляете обратно 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 голос
/ 09 декабря 2010

Я думаю, что там есть концептуальная ошибка.

Даже в WCF у вас все равно будет два отдельных вызова:

  • Клиент загружает HTML-разметку со ссылкой <img>
  • Клиент загружает данные двоичного изображения с сервера

Итак, у вас будет два метода в WCF-Service: string GetUSPSLabelMarkup() и byte() GetUSPSLabelImageData().

...