无法通过在 WebBrowser 站点中打开来获取更新的条形码图像

Can't get updated barcode image via opened in WebBrowser site

我的问题如下: 我尝试通过 WebBrowser 打开条码在线生成器并获取条码图像。 这是我的代码:

/// <summary>
/// Main form of barcode server
/// </summary>
public partial class MainForm : Form
{
    #region Constants
    private const String BarCodeSite = "http://www.abarcode.net/online.aspx?barcode=EAN13";//"http://barcode.tec-it.com/en#";
    #endregion

    /// <summary>
    /// Main form constructor
    /// </summary>
    public MainForm()
    {
        InitializeComponent();
    }

    /// <summary>
    /// This event occured after form load
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_Load(object sender, EventArgs e)
    {
        webBrowser.Navigate(new Uri(BarCodeSite));
    }


    /// <summary>
    /// Occurs when form is closing.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        try
        {
            barcodeServer.Abort();
        }
        catch (Exception ex)
        {
            // do nothing
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var code = textBox1.Text;
        var editText = webBrowser.Document.GetElementById("ValueToEncode");
        editText.SetAttribute("Value", code.Trim(new char[] { '[=10=]' }));
        webBrowser.Document.GetElementById("Label13").InvokeMember("click");
    }
}

我执行的操作: 1. 运行 我的项目 2. 在选项中选择图像缩放 250% 3. 粘贴到 textBox1 controle code 8414034620202 4.点击button1

预期结果:在文本字段中输入条码并根据输入的条码更新图像 实际结果:条码输入到文本字段,但图像未更新。我不明白为什么我的图像没有更新。我做错了什么吗?

备注: Id "ValueToEncode" 属于文本字段 ID "Label13" 属于带有文本 "Data to encode:" 的文本标签 我用过的网站: http://www.abarcode.net/online.aspx?barcode=EAN13

假设允许抓取该网站的内容,如果您不必依赖使用 WebBrowser 控件,因为它有很多怪癖,那么您的情况会更好。

在您的特定情况下,只需两个简单的 HttpWebRequest 调用即可获取生成的条形码图像:

CookieContainer cookies = new CookieContainer();

private void button1_Click(object sender, EventArgs e)
{
    // do a get to have the session cookie
    var wr = (HttpWebRequest) WebRequest.Create("http://www.abarcode.net/online.aspx");
    wr.CookieContainer = cookies;
    wr.Method = "GET";
    var stream =  wr.GetResponse().GetResponseStream();
    using(var sr = new StreamReader(stream))
    {
        // debug
        Debug.WriteLine(sr.ReadToEnd());
    }
    // get the image
    var imageReq = (HttpWebRequest)WebRequest.Create(
        String.Format(
            "http://www.abarcode.net/barcode.aspx?value={0}&type=EAN13", 
            textBox1.Text));
    // this makes if you get their watermark in the barcode or not
    imageReq.Referer = "http://www.abarcode.net/online.aspx?barcode=EAN13";
    imageReq.CookieContainer = cookies;
    imageReq.Method = "GET";
    // get the image stream
    using(stream = imageReq.GetResponse().GetResponseStream())
    {
        // create the bitmap.
        pictureBox1.Image =  Bitmap.FromStream(stream);
    }
}

我有一个 CookieContainer 来捕获和 re-use WebRequest 调用中的 cookie。我需要添加的唯一特别的东西是引用 header 以防止水印出现。

您的结果将如下所示: