2

POST托管了一个对 ASPX 页面执行某些操作的 Web 服务。

编码:

 [WebMethod]
        public string Test()
        {
            sb.AppendLine("Start");
            try
            {
                var t = new Thread(MyThreadStartMethod);
                t.SetApartmentState(ApartmentState.STA);
                t.Start();
                t.Join();
            }
            catch (Exception ex)
            {
                sb = sb.AppendLine(ex.ToString());
            }
            sb.AppendLine("Finish");
            return sb.ToString();
        }

         private void MyThreadStartMethod(object obj)
        {
            try
            {
                WebBrowser browser = new WebBrowser();
                browser.DocumentCompleted += browser_DocumentCompleted;
                browser.Url = new Uri("http://www.wikipedia.com");
                while (browser.ReadyState != WebBrowserReadyState.Complete)
                {
                    System.Windows.Forms.Application.DoEvents();
                    Thread.Sleep(60);
                }
            }
            catch (Exception ex)
            {
                sb = sb.AppendLine(ex.ToString());
            }
        }

        void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            sb = sb.AppendLine("Document completed: " + e.Url);
        }

当尝试在我的共享托管服务器上运行它时,我总是遇到超时错误。

尝试了下一个代码来检查我是否可以连接到第三方地址并且它工作正常。

private bool checkUrl(string url)
{
    try
    {
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = "HEAD";
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        return (response.StatusCode == HttpStatusCode.OK);
    }
    catch
    {
        return false;
    }
}

任何人都可以解释运行第一个代码的问题吗?他们会阻止什么吗?

4

1 回答 1

0

您必须从代码中删除接下来的 2 行

System.Windows.Forms.Application.DoEvents();
Thread.Sleep(60);

因为它正在阻止您的网络浏览器控件完成导航。

Hans Passant 提出了如何在单独的线程中运行 WebBrowser 控件的最佳示例

于 2013-08-07T02:40:53.237 回答