我正在使用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错误。
如果我删除了browser.Navigate("https://en.wikipedia.org/wiki/Wiki");
行,则不会发生任何错误。
任何想法 ?
我怀疑这与System.Windows.Forms事件有关。
谢谢,
答案 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;
}
}
以下是我测试过的结果的屏幕截图:
更新
很抱歉我误解了您想在网络加载完成后调用JavaScript函数的方法。根据您的问题,我建议您使用Azure VM或Cloud Service来执行此操作,因为没有这种限制。
有关Azure VM的更多信息供您参考: Virtual Machines Documentation
有关Azure云服务的更多信息: Cloud Services Documentation