2012-10-03 63 views
6

我花了很多時間配置我的代理。目前我使用一種名爲proxybonanza的服務。他們爲我提供了一個我用來獲取網頁的代理。代理在本地工作,但上傳到網絡主機時失敗

我使用HTMLAGILITYPACK

現在,如果我不使用代理服務器上運行我的代碼有本地或者上傳到虛擬主機提供商的服務器沒有問題。

如果我決定使用代理,它需要更長的時間,但它仍然可以在本地使用。

If I publish my solution to, to my webhost I get a SocketException (0x274c) 

"A connection attempt failed because the connected party did not properly respond 
after a period of time, or established connection failed because connected host has 
failed to respond 38.69.197.71:45623" 

我一直在調試這個很長一段時間。

我的app.config有兩個條目是有關這個

httpWebRequest useUnsafeHeaderParsing="true" 
httpRuntime executionTimeout="180" 

,幫助我通過幾個問題。

現在這是我的C#代碼。

HtmlWeb htmlweb = new HtmlWeb(); 
htmlweb.PreRequest = new HtmlAgilityPack.HtmlWeb.PreRequestHandler(OnPreRequest); 
HtmlDocument htmldoc = htmlweb.Load(@"http://www.websitetofetch.com, 
             "IP", port, "username", "password"); 

//This is the preRequest config 
static bool OnPreRequest(HttpWebRequest request) 
    { 
     request.KeepAlive = false; 
     request.Timeout = 100000; 
     request.ReadWriteTimeout = 1000000; 
     request.ProtocolVersion = HttpVersion.Version10; 
     return true; // ok, go on 
    } 

我在做什麼錯?我已經在appconfig中啓用了跟蹤器,但是我沒有在我的虛擬主機上登錄...?

Log stuff from app.config 

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing" > 
    <listeners> 
     <add name="ServiceModelTraceListener"/> 
    </listeners> 
    </source> 


    <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing"> 
    <listeners> 
     <add name="ServiceModelTraceListener"/> 
    </listeners> 
    </source> 
    <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing"> 
     <listeners> 
      <add name="ServiceModelTraceListener"/> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add initializeData="App_tracelog.svclog" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    name="ServiceModelTraceListener" traceOutputOptions="Timestamp"/> 
</sharedListeners> 
</system.diagnostics> 

任何人都可以發現這個問題我有這些設置和關閉像一千倍..

request.KeepAlive = false; 
    System.Net.ServicePointManager.Expect100Continue = false; 

卡爾

+0

您是否允許在您的應用程序配置上進行網絡請求?或者,也許你忘了讓mimetype?你託管什麼樣的服務器? – wegginho

+0

@wegginho Im在共享的主人。我沒有VPS只是一個標準的webhosting帳戶與asp.net 4.0平臺。 – 8bitcat

+0

這絕對沒問題。您可以在web.config中執行通常對IIS執行的每項設置。稍有不同的是,每次保存或發佈web.config時,應用程序都會重新啓動。 – wegginho

回答

2

嘗試下載頁面爲一個字符串,然後再將它傳遞給HtmlAgilityPack。這將使您能夠將在下載過程中發生的錯誤與HTML解析過程中發生的錯誤隔離開來。如果您有代理兵種問題(請參閱文章末尾),您將能夠從HtmlAgilityPack配置問題中找出問題。

下載頁面上,使用Web客戶端:

// Download page 
System.Net.WebClient client = new System.Net.WebClient(); 
client.Proxy = new System.Net.WebProxy("{proxy address and port}"); 
string html = client.DownloadString("http://example.com"); 

// Process result 
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.LoadHtml(html); 

如果你想在要求更多的控制,使用System.Net.HttpWebRequest

// Create request 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/"); 

// Apply settings (including proxy) 
request.Proxy = new WebProxy("{proxy address and port}"); 
request.KeepAlive = false; 
request.Timeout = 100000; 
request.ReadWriteTimeout = 1000000; 
request.ProtocolVersion = HttpVersion.Version10; 

// Get response 
try 
{ 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream stream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(stream); 
    string html = reader.ReadToEnd(); 
} 
catch (WebException) 
{ 
    // Handle web exceptions 
} 
catch (Exception) 
{ 
    // Handle other exceptions 
} 

// Process result 
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.LoadHtml(html); 

此外,還要確保您的代理提供商(proxybonanza)允許從您的生產准入環境到您的代理。大多數提供商將限制對某些IP地址的代理訪問。他們可能允許訪問您在本地運行的網絡的外部IP,但不允許您的生產環境的外部IP地址。

2

聽起來您的虛擬主機已禁用ASP.NET應用程序出站連接的安全性,因爲它會允許其他腳本/應用程序從其服務器執行惡意攻擊。

您必須要求他們解除您的帳戶中的連接,但如果他們拒絕接受,不要感到驚訝。

相關問題