Azure Appservice中的Web浏览器

时间:2018-07-16 12:59:26

标签: c# azure

我正在使用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;
            }
        }
}

正常情况下,一切正常。 但是,一旦我将其发布到Azure,就会发生502错误。 enter image description here 如果我删除了browser.Navigate("https://en.wikipedia.org/wiki/Wiki");行,则不会发生任何错误。 任何想法 ? 我怀疑这与System.Windows.Forms事件有关。

谢谢,

1 个答案:

答案 0 :(得分:0)

正如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;
        }

    }

以下是我测试过的结果的屏幕截图:

enter image description here

enter image description here

更新

很抱歉我误解了您想在网络加载完成后调用JavaScript函数的方法。根据您的问题,我建议您使用Azure VM或Cloud Service来执行此操作,因为没有这种限制。

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

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