在Windows服务中使用OWIN托pipeWebAPI

我使用OWIN自己托pipe的Web API(在Windows服务中)。 据我所知,这足以使HTTP请求来到Windows服务。 我可以在本地(从同一台机器)访问WebAPI URL( http://localhost/users ),但不能从其他机器访问。 我正在使用端口80, IIS停止 。 其他网站(托pipe在IIS中,在端口80上)在IIS运行时正常工作。

//在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请求的操作系统模块,只是猜测。

您的机器的防火墙可能会阻止传入的请求。 你可以这样做:

您可以运行wf.msc命令打开具有高级安全性的Windows防火墙,并为TCP端口80添加新的入站规则。

(你应该注意到一些以World Wide Web Services...开始的入站规则World Wide Web Services...这些是针对IIS的,我不确定是否启用这些规则足以让你的Windows服务接收请求…你可以尝试并看看这是否正常工作,如以前build议,您可以创build一个新的入站规则..)

更新
根据您的评论,可能是因为您的url注册,您无法击中该服务。 以下是使用HttpListener注册多个URL的一些示例。

 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

有两件事情会阻止你在Owin服务中使用与“localhost”不同的东西:

  1. 该应用程序需要以pipe理员身份运行,才能打开与“localhost”不同的主机名的端口。 您可以通过运行具有pipe理员权限的应用程序或使用以下命令为给定端口添加例外来解决此问题: netsh http add urlacl url=http://*:9000/ user=<your user>
  2. Windows防火墙可能会阻止来自其他计算机的stream量。 在我的情况下,防火墙不阻止本地stream量(我可以到http://localhost:9000http://127.0.0.1:9000http://192.168.1.193:9000 – 这是我的本地IP地址同一台计算机,但需要向防火墙添加一个端口例外,以允许从另一台计算机获得此服务)

这实际上是一个简单的监督我也绊倒:如果你只听localhost,127.0.0.1等的请求 – 没有人会看到它,因为只有你(自我)理解你的目标。 在我的机器上,我是本地主机,如果我要求您的IP在任何端口上,该服务会看到http:// your_ip:80 ,而不是本地主机。 所有你需要做的就是在“http:// *:{0}”服务,这样你可以通过onStart()传递端口。

我正面临类似的问题。 下面的解决scheme为我工作。

 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)) { ... }