2010-12-09 38 views
1

J'ai une page ASP.NET où je suis rendu quelques balises HTML qui comprend une image de code à barres qui est généré par une autre page asp.netWCF: Comment créer une image dynamique dans un service WCF et la renvoyer à l'appelant?

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

et dans les barcode.aspx.cs, j'ai

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(); 
} 

-je utiliser les mêmes fonctionnalités dans de nombreux websites.So similaires maintenant je suis en train de convertir à un service WCF où sera généré et sera envoyé le balisage pour la div « divDynamic » retour à la client (un site Web asp.net). Mon service a une méthode de retour type chaîne qui wi ll retourner le HTMLMarkup comme suit

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

     return strHtml.ToString(); 

    } 

Je me demande comment dois-je faire la partie de génération d'image dans la méthode ci-dessus dans mon service? Je crois que Response.BinaryWrite ne devrait pas fonctionner ici.

Des pensées? Merci à l'avance

Répondre

2

Si vous envoyez de nouveau HTML, cela signifie que le consommateur peut comprendre la balise IMG aussi bien, alors pourquoi ne vous envoie pas ceci:

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

quel est le problème avec ça?

PS: vous pouvez simplifier votre code de streaming comme celui-ci (pas besoin de créer un flux de mémoire et un tableau d'octets qui va lentement tuer votre tas de serveur):

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); 
} 

Aussi, assurez-vous d'avoir une cohérence entre ContentType et ImageFormat (vous déclarez JPEG sur un et BMP sur l'autre).

+0

Je ne veux plus avoir de code-barres.aspx côté consommateur.La génération d'image de code-barres devrait être dans le service WCF. Non côté client (application asp.net) – Shyju

+0

Si vous envoyez du code HTML, vous ne pouvez créer un tag IMG SRC qui répondra à la requête HTTP (ce que vous avez déjà). Si vous voulez un service WCF, vous ne serez pas en charge du HTML. Vous devez faire un choix. HTML ou WCF? Si c'est WCF, alors voir ce thread SO: http://stackoverflow.com/questions/592505/how-can-a-wcf-service-return-large-amounts-of-data –

+0

GenCode128 peut également être installé à partir de NuGet: https://www.nuget.org/packages/GenCode128/ –

1

Je pense qu'il y a une erreur conceptuelle là-dedans.

Même dans WCF, vous aurez toujours deux appels distincts:

  • charges client Balise HTML avec le <img> référence
  • client charge des données d'image binaires depuis un serveur

Alors vous avoir deux méthodes sur le service WCF: string GetUSPSLabelMarkup() et byte() GetUSPSLabelImageData().