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:
netsh http add urlacl url=http://*:9000/ user=
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: