2012-10-03 35 views
6

He pasado un buen rato ahora configurando mi proxy. Por el momento, uso un servicio llamado proxybonanza. Me proporcionan un proxy que utilizo para buscar páginas web.Proxy funciona localmente pero falla cuando se carga en el host web

estoy usando HTMLAGILITYPACK

Ahora si me quedo mi código sin un proxy no hay problema a nivel local o cuando se envían al servidor de hosting.

Si decido usar el proxy, tarda un poco más pero funciona de forma local.

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" 

He estado depurando esto desde hace mucho tiempo.

Mi app.config tiene dos entradas que son relevantes para este

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

Eso me ayudó a través de un par de problemas.

Ahora este es mi código 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 
    } 

¿Qué estoy haciendo mal? He habilitado el rastreador en la aplicación, pero no consigo iniciar sesión en mi servidor web ...?

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> 

¿Alguien puede detectar el problema esto lo he ajuste de encendido y apagado como mil veces ..

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

Carl

+0

¿Ha permitido la solicitud web en la configuración de su aplicación? ¿O tal vez se olvidó de permitir el tipo mimet? ¿Qué tipo de servidor estás alojando? – wegginho

+0

@wegginho Im en un host compartido.No tengo VPS solo una cuenta estándar de alojamiento web con la plataforma asp.net 4.0. – 8bitcat

+0

Eso está absolutamente bien. Puede hacer todas las configuraciones que normalmente le haría al IIS dentro de su web.config. La pequeña diferencia es que cada vez que guarda o publica el archivo web.config, la aplicación se reinicia. – wegginho

Respuesta

2

Intente descargar la página como una cadena primero, y luego pasarla a HtmlAgilityPack. Esto le permitirá aislar los errores que ocurren durante el proceso de descarga de los que ocurren durante el proceso de análisis html. Si tienes un problema con proxybonanza (ver final de la publicación), podrás aislar ese problema de un problema de configuración de HtmlAgilityPack.

Descargar página utilizando WebClient:

// 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); 

Si desea más control sobre la solicitud, utilice 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); 

Además, asegúrese de que su proveedor de proxy (proxybonanza) permite el acceso de su producción ambiente a sus poderes. La mayoría de los proveedores limitarán el acceso a los proxies a ciertas direcciones IP. Es posible que hayan permitido el acceso a la IP externa de la red en la que se ejecuta localmente, pero NO a la dirección IP externa de su entorno de producción.

2

Parece que su proveedor de alojamiento web ha deshabilitado las conexiones salientes de las aplicaciones ASP.NET para la seguridad, ya que permitiría a otros scripts/aplicaciones para llevar a cabo ataques maliciosos de sus servidores.

Tendría que pedirles que desbloqueen conexiones en su cuenta, pero no se sorprenda si dicen que no.

Cuestiones relacionadas