Hosting WebAPI za pomocą OWIN w usłudze windows

Mam własny hosting API Web przy użyciu OWIN (wewnątrz usługi windows). Z tego, co rozumiem, to wystarczy, aby żądania HTTP przychodzą do usługi windows. Jestem w stanie trafić adres URL WebAPI (http://localhost/users) lokalnie (z tej samej maszyny), ale nie z innych maszyn. Używam Portu 80, IIS jest zatrzymany . Inne strony internetowe (hostowane w IIS, na porcie 80) działają poprawnie, gdy IIS jest uruchomiony.

/ / w usłudze 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);
    }
}

Czy muszę zrobić coś więcej, aby to działało z inne maszyny? (Mam wrażenie, że przychodzące żądania http nie są przekazywane do usługi windows, ale tylko do IIS. Gdy trafisz lokalnie, prawdopodobnie nie przechodzi przez moduł systemu operacyjnego, który nasłuchuje żądań http. Tylko zgaduję.)

Author: Narayana, 2014-02-07

5 answers

Zapora twojego komputera może blokować przychodzące żądania. Można zrobić:

Można uruchomić polecenie wf.msc, aby otworzyć Zaporę systemu Windows z zaawansowanym zabezpieczeniem i dodać nową regułę przychodzącą dla portu TCP 80.

(Należy zauważyć kilka reguł przychodzących zaczynających się od World Wide Web Services.... To dla IIS. Nie jestem pewien, czy włączenie tych zasad byłoby wystarczające, aby nawet umożliwić Twojej usłudze windows odbieranie żądań...możesz spróbować i zobaczyć, czy to działa inaczej, jak sugerowano wcześniej, możesz można utworzyć nową regułę przychodzącą..)

Update :
Na podstawie Twojego komentarza może być tak, że z powodu rejestracji adresu Url nie możesz trafić do usługi. Poniżej przedstawiono kilka przykładów rejestracji wielu adresów URL za pomocą 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))
{

Możesz przeczytać więcej o rejestracji url w poniższym links:
http://technet.microsoft.com/en-us/library/bb630429.aspx
http://technet.microsoft.com/en-us/library/bb677364.aspx

 51
Author: Kiran Challa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 19:09:03

Są 2 rzeczy, które uniemożliwią Ci korzystanie z czegokolwiek innego niż "localhost" w usłudze Owin:

    [7]} aplikacja musi działać jako administrator, aby otworzyć port o innej nazwie hosta jako "localhost". Możesz to naprawić, uruchamiając aplikację z uprawnieniami administratora lub dodając wyjątek dla danego portu za pomocą: netsh http add urlacl url=http://*:9000/ user=<your user> [[7]}Zapora systemu windows może blokować ruch z innych komputerów. W moim przypadku firewall nie blokował lokalnego ruchu (mogłem dostać się do http://localhost:9000 lub http://127.0.0.1:9000 lub http://192.168.1.193:9000 - który był moim lokalnym adresem IP z tego samego komputera, ale wymagał dodania wyjątku portu do Firewalla, aby umożliwić dostęp do tej usługi z innego komputera)
 16
Author: bart59,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-28 16:07:28

Miałem podobny problem. Poniższe rozwiązanie zadziałało dla mnie.

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))
{
    ...
}
 6
Author: Maggie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 14:48:57

To jest tak naprawdę proste przeoczenie, na które również się natknąłem: jeśli słuchasz tylko żądań na localhost, 127.0.0.1 , itp-nikt nigdy tego nie zobaczy, ponieważ tylko Ty (jaźń) rozumie cię jako ten cel. Na moim komputerze jestem localhost, jeśli req IP na dowolnym porcie, że usługa zobaczy get http://your_ip:80 , nie localhost. Wszystko co musisz zrobić to serwować na " http://*:{0}", i w ten sposób można OnStart() przejść przez port.

 4
Author: Nathan Teague,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 02:08:52

Podobny problem. Napisałem usługę ServiceStack i hostowałem ją wewnątrz usługi Windows przy użyciu implementacji AppSelfHostBase. Uwaga: został napisany jako aplikacja Net Core, która kompiluje się jako aplikacja konsolowa, ale dzięki magii PeterKottas.DotNetCore.WindowsService (dostępny przez NuGet) może być zainstalowany jako usługa Windows.

Ustawiłem baseAddress na http://*.8088/ i przekazałem go do mojej implementacji AppSelfHostBase, ale mogłem tylko dotrzeć do serwisu z tego samego komputera, na którym został zainstalowany, a nie innego, jak stwierdzono, próbując otworzyć stronę metadanych (http://[machine]:8088/api/metadane) w przeglądarce. Rozwiązaniem było dodanie mojej aplikacji konsolowej .plik exe do listy dozwolonych aplikacji w Zaporze systemu Windows na serwerze, na którym został zainstalowany. Po prostu przejdź do zapory "dozwolona aplikacja" okno dialogowe w Panelu sterowania na serwerze, kliknij " Zezwól na inną aplikację..."przycisk i przejdź do usługi Windows wykonywalny:

Windows Firewall Allowed app dialog

 1
Author: Phoeniceus Agelaius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-24 19:28:24