2014-02-07 41 views
41

我使用OWIN(在Windows服務中)自我託管的Web API。據我所知,這足以讓HTTP請求來到Windows服務。我可以在本地(來自同一臺機器)訪問WebAPI URL(http://localhost/users),但不能從其他機器訪問。我正在使用端口80,IIS停止。其他網站(託管在IIS中,在端口80上)在IIS運行時工作正常。在Windows服務中使用OWIN託管WebAPI

// 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 14年14月14日在14:08 –

回答

49

您的計算機的防火牆可能會阻止傳入的請求。你可以這樣做:

可以運行wf.msc命令打開Windows防火牆具有高級安全性和添加新的入站規則爲TCP端口80

(你應該注意到夫婦的入站規則開始World Wide Web Services...這些。對於IIS,我不確定是否啓用這些規則足以讓您的Windows服務接收請求...您可以嘗試查看它是否可以像以前建議的那樣工作,您可以創建一個新的入站規則..)

更新:基於您的評論
,我這可能是因爲你的網址註冊,你無法訪問該服務。以下是使用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

+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

有兩件事情會阻止你使用什麼不同從Owin服務「本地主機」:

  1. 的應用程序需要以管理員爲了打開一個端口,用不同的主機上運行作爲「localhost」。您可以通過以管理員權限運行應用程序或使用以下命令爲給定端口添加例外來解決此問題:netsh http add urlacl url=http://*:9000/ user=<your user>
  2. Windows防火牆可能會阻止來自其他計算機的流量。在我的情況下,防火牆沒有阻止本地流量(我可以到http://localhost:9000http://127.0.0.1:9000http://192.168.1.193:9000 - 這是我的本地IP地址來自同一臺計算機,但需要添加一個端口例外到防火牆,以允許從另一個服務電腦)
4

這實際上是一個簡單的疏忽我也絆倒了:如果你只聽localhost上的請求,127.0.0.1等 - 沒有人會看到它,因爲只有你(自我)理解你爲那個目標。在我的機器上,我是本地主機,如果我要求您的IP在任何端口上,該服務將看到http://your_ip:80,而不是本地主機。你所要做的只是在「http:// *:{0}」上提供,這樣你可以通過onStart()傳遞端口。

1

相似的問題。我編寫了一個ServiceStack服務,並使用AppSelfHostBase實現將其託管在Windows服務中。注意:這是作爲一個編譯爲控制檯應用程序的Net Core應用程序編寫的,但通過PeterKottas.DotNetCore.WindowsService(通過NuGet可用)的魔力可以作爲Windows服務安裝。

我將baseAddress設置爲http://*.8088/,並將其傳遞給我的AppSelfHostBase實現,但我只能從安裝它的同一臺計算機上訪問該服務,而不能通過嘗試打開瀏覽器中的元數據頁面(http://[machine]:8088/api/metadata)。解決方案是將我的控制檯應用程序.exe文件添加到安裝它的服務器上的Windows防火牆中允許的應用程序列表。只要進入「允許的應用程序」,在服務器上的控制面板對話框中的防火牆,單擊「允許運行另一程序...」按鈕,並導航到Windows服務可執行文件:

Windows Firewall Allowed App dialog

相關問題