web-dev-qa-db-ja.com

WindowsサービスでOWINを使用してWeb APIをホストする

OWIN(Windowsサービス内)を使用してWeb APIを自己ホストしました。私が理解していることから、これはHTTPリクエストをWindowsサービスに送るのに十分です。 WebAPI URL(http://localhost/users)ローカル(同じマシンから)。ただし、他のマシンからは。ポート80を使用していますIISは停止しています。 IISが実行されている場合、IISのポート80でホストされている)他のWebサイトは正常に動作します。

// 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リクエストをリッスンするOSモジュールを通過しません。

46
Narayana

マシンのファイアウォールが着信要求をブロックしている可能性があります。できること:

wf.mscコマンドを実行して、セキュリティが強化されたWindowsファイアウォールを開き、TCPポート80の新しい受信ルールを追加できます。

World Wide Web Services...で始まるインバウンドルールがいくつかあります。これらはIIS用です。これらのルールを有効にしても、Windowsサービスがリクエストを受信できるようになるかどうかはわかりません...これが以前に提案されたとおりに機能する場合は、新しいインバウンドルールを作成できます。

更新
コメントに基づいて、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

54
Kiran Challa

Owinサービスで「localhost」とは異なるものを使用できないようにする2つのことがあります。

  1. 「localhost」として別のホスト名でポートを開くには、アプリを管理者として実行する必要があります。これを修正するには、管理者権限でアプリを実行するか、特定のポートに例外を追加します:netsh http add urlacl url=http://*:9000/ user=<your user>
  2. Windowsファイアウォールは、他のコンピューターからのトラフィックをブロックする場合があります。私の場合、ファイアウォールはローカルトラフィックをブロックしていませんでした(http://localhost:9000 または http://127.0.0.1:9000 または http://192.168.1.193:9000-これは同じコンピューターのローカルIPアドレスでしたが、ファイアウォールにポート例外を追加して、別のコンピューターからこのサービスにアクセスできるようにする必要がありました)
17
bart59

私は同様の問題に直面していました。以下のソリューションは私のために働いた。

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
Maggie

これは、実際には単純な見落としでもあります。localhost、127.0.0.1などでリクエストをリッスンする場合、あなた(あなた)だけがあなたをそのターゲットとして理解するため、誰もそれを見ることができません。私のマシンではlocalhostであり、ポートでIPが必要な場合、そのサービスはlocalhostではなくget http:// your_ip:8 と表示されます。あなたがしなければならないのは、「http:// *:{0}」で提供することです。そうすれば、onStart()でポートを渡すことができます。

4
Nathan Teague

同様の問題。 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

1

最終的に私のために働いたのはこの値でした:

StartOptions options = new StartOptions();
options.Urls.Add("http://*:9095");

using (WebApp.Start<Program>(options))
{
    ...
}

これを追加した後は、管理モードを使用してのみVisual Studioでアプリケーションを実行でき、アプリのリリースバージョンも管理モードで実行する必要があることに注意してください。

0
Allen