Hébergement WebAPI en utilisant OWIN dans un service Windows

J’ai une API Web auto-hébergée utilisant OWIN (dans un service Windows). D’après ce que j’ai compris, cela suffit pour que les requêtes HTTP arrivent au service Windows. Je peux bash l’URL WebAPI ( http://localhost/users ) localement (depuis la même machine), mais pas depuis d’autres machines. J’utilise le port 80, IIS est arrêté . D’autres sites Web (hébergés dans IIS, sur le port 80) fonctionnent correctement lorsque IIS est en cours d’exécution.

// Dans le service Windows:

 public partial class Service1 : ServiceBase { ... ... protected override void OnStart(ssortingng[] args) { Console.WriteLine("Starting service..."); ssortingng baseAddress = "http://localhost:80/"; WebApp.Start(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); } } 

Dois-je faire quelque chose de plus pour que cela fonctionne à partir d’autres machines? (J’ai le sentiment que les requêtes HTTP entrantes ne sont pas transmises au service Windows, mais uniquement à IIS. Lorsque vous appuyez sur localement, il ne passe probablement pas par le module du système d’exploitation qui écoute les requêtes HTTP.

Le pare-feu de votre appareil peut bloquer les demandes entrantes. Vous pourriez faire:

Vous pouvez exécuter la commande wf.msc pour ouvrir le pare-feu Windows avec sécurité avancée et append une nouvelle règle entrante pour le port TCP 80.

(Vous devriez remarquer quelques règles entrantes commençant par World Wide Web Services... . Celles-ci sont destinées à IIS. Je ne suis pas sûr que l’activation de ces règles suffirait à permettre à votre service Windows de recevoir les demandes… et voir si cela fonctionne autrement comme suggéré précédemment, vous pouvez créer une nouvelle règle entrante ..)

Mise à jour :
D’après votre commentaire, il se peut que vos enregistrements Url ne vous permettent pas d’accéder au service. Voici quelques exemples d’enregistrement de plusieurs URL avec HttpListener.

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

Vous pouvez en savoir plus sur l’enregistrement de l’URL dans les liens suivants:
http://technet.microsoft.com/en-us/library/bb630429.aspx
http://technet.microsoft.com/en-us/library/bb677364.aspx

Il y a 2 choses qui vous empêcheront d’utiliser quelque chose de différent de “localhost” dans le service Owin:

  1. L’application doit s’exécuter en tant qu’admin pour ouvrir un port avec un nom d’hôte différent de “localhost”. Vous pouvez résoudre ce problème en exécutant l’application avec des privilèges d’administrateur ou en ajoutant une exception pour un port donné en utilisant: netsh http add urlacl url=http://*:9000/ user=
  2. Le pare-feu Windows peut bloquer le trafic provenant d’autres ordinateurs. Dans mon cas, le pare-feu ne bloquait pas le trafic local (je pouvais accéder à http://localhost:9000 ou http://127.0.0.1:9000 ou http://192.168.1.193:9000 – qui était mon adresse IP locale depuis le même ordinateur, mais qu’il fallait append une exception de port au pare-feu pour permettre l’access à ce service depuis un autre ordinateur)

Je faisais face à un problème similaire. La solution ci-dessous a fonctionné pour moi.

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

Il s’agit en fait d’un simple oubli: Si vous n’écoutez que les requêtes sur localhost, 127.0.0.1, etc. – personne ne le verra jamais car seul vous (vous-même) vous comprenez comme cette cible. Sur ma machine, je suis localhost, si je demande votre IP sur n’importe quel port, ce service verra http: // your_ip: 80 , pas localhost. Tout ce que vous avez à faire est de servir sur “http: // *: {0}”, et de cette façon, onStart () peut passer le port.

Problème similaire J’avais écrit un service ServiceStack et je l’ai hébergé dans un service Windows à l’aide d’une implémentation AppSelfHostBase. Remarque: Ceci a été écrit en tant qu’application Net Core qui comstack en tant qu’application console, mais grâce à la magie de PeterKottas.DotNetCore.WindowsService (disponible via NuGet), il peut être installé en tant que service Windows.

J’ai défini la baseAddress sur http: //*.8088/ et l’ai transmise à mon implémentation AppSelfHostBase, mais je n’ai pu accéder au service qu’à partir de la même machine sur laquelle il était installé, comme indiqué en essayant d’ouvrir la page de métadonnées ( http: // [machine]: 8088 / api / metadata ) dans un navigateur. La solution consistait à append le fichier .exe de l’application de la console à la liste des applications autorisées du pare-feu Windows sur le serveur où il était installé. Accédez simplement à la boîte de dialog “Application autorisée” du pare-feu dans le panneau de configuration du serveur, cliquez sur le bouton “Autoriser une autre application …” et accédez au fichier exécutable du service Windows:

Boîte de dialogue Windows Firewall Allowed App