2012-03-16 4 views
4

Я попытался создать простой HTTP-сервер, используя System.Net.HTTPListener, но он не получает подключения с других компьютеров в сети. Пример кода:HTTPListener не работает по сети

class HTTPServer 
{ 
    private HttpListener listener; 
    public HTTPServer() { } 
    public bool Start() 
    { 
     listener = new HttpListener(); 
     listener.Prefixes.Add("http://+:80/"); 
     listener.Start(); 
     listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); 
     return true; 
    } 
    private static void ListenerCallback(IAsyncResult result) 
    { 
     HttpListener listener = (HttpListener)result.AsyncState; 
     listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener); 
     Console.WriteLine("New request."); 

     HttpListenerContext context = listener.EndGetContext(result); 
     HttpListenerRequest request = context.Request; 
     HttpListenerResponse response = context.Response; 

     byte[] page = Encoding.UTF8.GetBytes("Test"); 

     response.ContentLength64 = page.Length; 
     Stream output = response.OutputStream; 
     output.Write(page, 0, page.Length); 
     output.Close(); 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     HTTPServer test = new HTTPServer(); 
     test.Start(); 
     while (true) ; 
    } 
} 

Есть что-то неправильно с этим кодом, или есть еще одна проблема?

Я попытался запустить приложение с правами администратора, но когда я перейду на IP-адрес компьютера (то есть 192.168.1.100) на другом компьютере, я никогда не получаю запрос. Сервер отлично работает, если запрос отправляется с того же компьютера, на котором выполняется приложение (с использованием «localhost», «127.0.0.1» и «192.168.1.100»). Pinging работает отлично. Я также пробовал nginx, и это отлично работает по сети.

Я использую HTTPListener как легкий сервер для доставки веб-страницы с файлом Silverlight XAP с некоторыми динамическими параметрами init, clientaccesspolicy.xml и простой мобильной HTML-страницей.

ответ

18

Firewall          

+1

Вы правы. Это было довольно глупо со мной. Я предположил, что, поскольку приложение работает с правами администратора, что брандмауэр не был проблемой. И, как ни странно, я никогда не получал сообщение от брандмауэра Windows, следует ли блокировать или разрешать программу. Что ж, спасибо тебе. – user1273708

+8

Это должно выиграть кратчайший ответ или значок, тем не менее, удар по цели :) – V4Vendetta

+10

Hah! Мне пришлось проложить его без разрывов, чтобы дотянуться до него! – spender

0

Я также думал, что первый из брандмауэра. Однако проблема, где мои конечные точки:

Из урока я имел код вроде следующего

String[] endpoints = new String[] { 
    "http://localhost:8080/do_something/", 
    // ... 
}; 

Этот код работает только локально и только если вы используете локальный. Для того, чтобы иметь возможность использовать IP-адрес, я изменил его на

String[] endpoints = new String[] { 
    "http://127.0.0.1:8080/do_something/", 
    // ... 
}; 

На этот раз просьба внутрибрюшинно адрес работала, но сервер не отвечать на удаленные запросы другого IP. Что у меня работает для меня, чтобы использовать звезду (*) вместо локальный и 127.0.0.1, поэтому следующий код:

String[] endpoints = new String[] { 
    "http://*:8080/do_something/", 
    // ... 
}; 

Просто оставить это здесь, если кто-то натыкается на этот пост, как я.

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