【问题标题】:Webbrowser in Azure AppserviceAzure 应用服务中的 Web 浏览器
【发布时间】:2018-07-17 16:21:22
【问题描述】:

我正在使用 Azure 应用服务来托管 API。 API 包含一个调用普通 Webbroswer 的虚拟方法。 下面是代码:

[HttpGet]
    [Route("c")]
    public string GetCorrection()
    {
        string result = "NoResults";
        ClassLibrary2.Class2 class2 = new ClassLibrary2.Class2();
        try
        {
            Thread thread = new Thread(new ThreadStart(() =>
            {
                class2.Browse();

            }));
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
        }
        catch (Exception ex)
        {
            return ex.ToString();
        }

        return result;
    }


public string Browse()
        {
            using (WebBrowser browser = new WebBrowser())
            {
                browser.ScrollBarsEnabled = false;
                browser.ScriptErrorsSuppressed = true;
                browser.AllowNavigation = true;

                browser.Navigate("https://en.wikipedia.org/wiki/Wiki");

                return browser.DocumentTitle;
            }
        }
}

Eveything 在本地正常工作。 但是一旦我将它发布到 Azure,就会发生 502 错误。 如果我删除 browser.Navigate("https://en.wikipedia.org/wiki/Wiki"); 行,则不会发生错误。 任何想法 ? 我怀疑它是否与 System.Windows.Forms 事件有关。

提前致谢,

【问题讨论】:

  • 只是出于好奇,您为什么要使用 WebBrowser 对象?使用 HttpClient 获取文档标题不是更容易吗?见stackoverflow.com/questions/36803819/…
  • @RuiJarimba 这是一个虚拟测试。我的原始代码打开一个 HTML 页面,并在 document.loadComplete 事件上调用 javascript 函数
  • @RuiJarimba 你知道 Chromium (CefSharp) 是否可以成为解决方案吗?
  • 对不起,我完全不知道它是否会起作用。您是否考虑过使用 SignalR? codemag.com/article/1210071/…

标签: c# azure


【解决方案1】:

正如 Rui Jarimba 上面所说,我们不能在 Azure WebService 中使用 WebBrowser 控制器:Using WebBrowser control in an Azure webjob

作为一种解决方法,我们可以使用 HttpClient 来实现,这里有一个简单的演示供您参考:

    /// <summary>
    /// Get Web Title By HttpClient
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public static string GetWebTitleByHttpClient(string url)
    {           
        HttpClient httpclient = new HttpClient();           
        var task = httpclient.GetAsync(url);
        task.Wait();
        HttpResponseMessage message = task.Result;

        Stream myResponseStream = message.Content.ReadAsStreamAsync().Result;
        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
        String result = myStreamReader.ReadToEnd();
        int startIndex = result.IndexOf("<title>") + 7;
        int endIndex = result.IndexOf("</title>");
        if (endIndex > startIndex)
        {
            string title = result.Substring(startIndex, endIndex - startIndex);
            return title;
        }
        else
        {
            return null;
        }

    }

这是我测试的结果截图:

更新

很抱歉误会您想在网页加载完成后调用 JavaScript 函数。根据你的问题,我建议你使用 Azure VM 或云服务来做,因为没有这样的限制。

有关 Azure VM 的更多信息供您参考: Virtual Machines Documentation

有关 Azure 云服务的更多信息: Cloud Services Documentation

【讨论】:

  • 在cmets中他说他在调用一个JavaScript函数,这可能是使用WebBrowser的原因。
  • @Jaxi 谢谢提醒,我已经更新答案了
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 2016-12-20
  • 2013-01-22
  • 2013-01-14
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多