2011-01-10 3 views
2

У меня есть следующие C# программы:удаленный хост не может быть решена:

 
using System; 
using System.IO; 
using System.Net; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string sourceUri = "http://tinyurl.com/22m56h9"; 

      var request = WebRequest.Create(sourceUri); 
      try 
      { 
       //Edit: request = WebRequest.Create(sourceUri); 
       request.Method = "HEAD"; 

       var response = request.GetResponse(); 
       if (response != null) 
       { 
        Console.WriteLine(request.GetResponse().ResponseUri); 
       } 
      } 
      catch (Exception exception) { 
       Console.WriteLine(exception.Message);     
      } 
      Console.Read(); 
     } 
    }  
} 
 

Если запустить мою программу с sourceUri = «http://tinyurl.com/22m56h9» everithing в порядке, я просто получаю назначение канала tinyurl.
Но если запустить мою программу с помощью ссылки tinyurl, которая перенаправляется на сайт, помеченный как вредоносное ПО, мой код генерирует исключение: The remote host could not be resolved: '...'. Мне нужно получить uri ссылки вредоносного ПО, потому что я хочу сделать приложение, которое ищет некоторый тест для ссылки и возвращает, если они являются вредоносными программами или нет, и если ссылка была уменьшена (в случае выше), мне нужно знать, где перенаправляется.

Итак, мой вопрос: «Я что-то не так в коде?» или Есть ли лучший aproach при тестировании, если ссылка является перенаправлением или нет? Заранее благодарю

+1

Просто обратите внимание, что вам не нужно дважды «создавать» веб-запрос. –

+0

Хорошее замечание. Спасибо – cristian

+0

Так оно: '22m5.6h9' или' 22m56h9'? – leppie

ответ

2

Вместо того, чтобы поймать общее исключение, вы должны попытаться поймать WebException объект вместо этого. Что-то вроде:

try 
{ 
    request.Method = "HEAD"; 

    var response = request.GetResponse(); 
    if (response != null) 
    { 
     Console.WriteLine(request.GetResponse().ResponseUri); 
    } 
} 
catch (WebException webEx) { 
    // Now you can access webEx.Response object that contains more info on the server response    
    if(webEx.Status == WebExceptionStatus.ProtocolError) { 
     Console.WriteLine("Status Code : {0}", ((HttpWebResponse)webEx.Response).StatusCode); 
     Console.WriteLine("Status Description : {0}", ((HttpWebResponse)webEx.Response).StatusDescription); 
    } 
} 
catch (Exception exception) { 
    Console.WriteLine(exception.Message);     
} 

WebException содержит Response объект, который вы можете получить доступ, чтобы узнать более подробную информацию о том, что на самом деле вернулся сервер.

1

Возможно, вас заинтересует код ответа сервера (HTTP-заголовки). Переадресация обычно выполняется ими.

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection

+0

Переадресации обрабатываются с помощью WebRequest, так что это усложняет вопросы, поскольку промежуточный запрос \ ответы не отображаются вызывающему. Просто голова и хвост. –

Смежные вопросы