2014-02-07 2 views
41

У меня есть собственный веб-API с использованием OWIN (внутри службы Windows). Насколько я понимаю, этого достаточно, чтобы HTTP-запросы приходили на службу Windows. Я могу удалять URL WebAPI (http://localhost/users) локально (с той же машины), но не с других машин. Я использую порт 80, IIS остановлен. Другие веб-сайты (размещенные в IIS, на порту 80) работают нормально, когда IIS работает.Хостинг WebAPI с использованием OWIN в службе windows

// В службе окон:

public partial class Service1 : ServiceBase 
{ 
    ... 
    ... 

    protected override void OnStart(string[] args) 
    { 
     Console.WriteLine("Starting service..."); 
     string baseAddress = "http://localhost:80/"; 
     WebApp.Start<Startup>(baseAddress); //This is OWIN stuff. 
    } 
    ... 
    ... 
} 

public class Startup 
{ 
    // This code configures Web API. The Startup class is specified as a type 
    // parameter in the WebApp.Start method. 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     // Configure Web API for self-host. 
     var config = new HttpConfiguration(); 
     WebApiConfig.Register(config); 
     appBuilder.UseWebApi(config); 
    } 
} 

мне нужно сделать что-то еще, чтобы получить эту работу с другими машинами делать? (У меня такое ощущение, что входящие HTTP-запросы не пересылаются службе Windows, а только в IIS. Когда вы нажмете локально, возможно, он не проходит через модуль ОС, который слушает HTTP-запросы.)

+3

Вы можете проверить в этом примере проект GitHub: https://github.com/danesparza/OWIN-WebAPI-Service –

+2

Только для справок в будущем: например, комментарий justmara ниже: вы можете просто запустить его по адресу http: // *: 80 /, чтобы он ответил по каждому доступному адресу. - justmara 27 мая 14 в 14:08 –

ответ

49

Брандмауэр вашей машины может блокировать входящие запросы. Вы можете сделать:

Вы можете запустить wf.msc команды, чтобы открыть брандмауэр Windows в режиме повышенной безопасности и добавить новое правило входящего трафика для порта TCP 80.

(Вы должны заметить несколько входящих правила, начиная с World Wide Web Services... Это. для IIS. Я не уверен, что если разрешить эти правила будет достаточно, чтобы даже позволить вашей службе Windows получать запросы ... вы можете попробовать и посмотреть, будет ли это работать иначе, как было предложено ранее, вы можете создать новое правило для входящих событий.)

Обновление:
На основе вашего комментария i t может быть, что из-за регистрации вашего Url вы не можете попасть в службу. Ниже приведены некоторые примеры регистрации нескольких URL-адресов с помощью HttpListener.

StartOptions options = new StartOptions(); 
options.Urls.Add("http://localhost:9095"); 
options.Urls.Add("http://127.0.0.1:9095"); 
options.Urls.Add(string.Format("http://{0}:9095", Environment.MachineName)); 

using (WebApp.Start<Program>(options)) 
{ 

Вы можете прочитать больше о регистрации URL-адрес в следующих ссылок:
http://technet.microsoft.com/en-us/library/bb630429.aspx
http://technet.microsoft.com/en-us/library/bb677364.aspx

+0

Просто выключите брандмауэр, чтобы убедиться, что это действительно проблема, и если он решает вашу проблему, добавьте правило. – 0leg

+0

Пробовал оба, не работает. 'http: // localhost/users' работает, но' http: //127.0.0.1: 80/users' или 'http: // machine-name/users' не работают. Если я использую порт 80, я не получаю 404, если я использую другой порт, я получаю 400 неправильных запросов - неверное имя хоста запроса. Значит ли это что-то? – Narayana

+0

Проверьте мое обновление выше. –

5

Я столкнулся с аналогичной проблемой. Ниже решение работало для меня.

StartOptions options = new StartOptions(); 
options.Urls.Add("http://localhost:9095"); 
options.Urls.Add("http://127.0.0.1:9095"); 
options.Urls.Add(string.Format("http://{0}:9095", Environment.MachineName)); 

using (WebApp.Start<Program>(options)) 
{ 
    ... 
} 
15

Есть 2 вещи, которые мешают вам использовать что-либо отличное от «локальный» в службе Owin:

  1. приложение должно работать с правами администратора, чтобы открыть порт с другим именем хоста как «localhost». Вы можете исправить это, либо запустив приложение с правами администратора, либо добавив исключение для данного порта, используя: netsh http add urlacl url=http://*:9000/ user=<your user>
  2. Брандмауэр Windows может блокировать трафик с других компьютеров. В моем случае брандмауэр не блокировал локальный трафик (я мог добраться до http://localhost:9000 или http://127.0.0.1:9000 или http://192.168.1.193:9000 - это был мой локальный IP-адрес с того же компьютера, но ему необходимо было добавить исключение порта в брандмауэр, чтобы получить доступ к этой услуге из другого компьютер)
4

Это на самом деле простой надзор, с которым я также справился: если вы только слушаете запросы на localhost, 127.0.0.1 и т. д. - никто никогда его не увидит, потому что только вы (я) понимаете вас как эта цель. На моей машине я localhost, если я req ваш IP на любом порту, эта служба увидит get http://your_ip:80, а не localhost.Все, что вам нужно сделать, это обслуживать на «http: // *: {0}», и таким образом вы можете переносить порт onStart().

1

Аналогичный вопрос. Я написал ServiceStack Service и разместил его внутри службы Windows, используя реализацию AppSelfHostBase. Примечание. Это было написано как приложение Net Core, которое компилируется в качестве консольного приложения, но через волшебство PeterKottas.DotNetCore.WindowsService (доступное через NuGet) можно установить как службу Windows.

Я установил baseAddress на http: //*.8088/ и передал его в мою реализацию AppSelfHostBase, но я мог только добраться до службы с той же машины, на которой он был установлен, и ни на что другое, как установлено, пытаясь открыть страницу метаданных (http://[machine]:8088/api/metadata) в браузере. Решение заключалось в том, чтобы добавить файл консольного приложения .exe в список разрешенных приложений в брандмауэре Windows на сервере, на котором он был установлен. Просто зайдите в брандмауэре «разрешено приложение» Диалог в панели управления на сервере, нажмите кнопку «Разрешить другое приложение ...» кнопку, и перейдите к исполняемому файлу службы Windows:

Windows Firewall Allowed App dialog

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