web-dev-qa-db-ja.com

.netコアセルフホストWeb APIへのリモート接続

私は1つのアクションを持つシンプルな.netコアWeb APIを持っています:

[Route("[action]")]
public class APIController : Controller
{
    // GET api/values
    [HttpGet]
    public string Ping()
    {
        return DateTime.Now.ToString();
    }
}

これをdotnet runで実行すると、

Hosting environment: Production
Content root path: C:\Users\xxx\Documents\Visual Studio 2015\Projects\SelfHostTest\src\SelfHostTest
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

ブラウザに移動して http:// localhost:5000/ping と入力すると、現在の時刻が正常に返されます。 ただし、リモートマシン(同じLAN)にアクセスし、 http:// odin:5000/ping を介してサービスにアクセスしようとしています= 404エラーが発生します。 (Odinは、dotnet runを介してコンソールでWeb APIを実行しているマシンの名前です)。

サーバー(およびクライアント!)の両方のファイアウォールがオフになっています。 「odin」に正常にpingできます。

ここで不足している簡単なステップは何ですか。自宅でも職場でもこれを試しましたが、成功しませんでした。

18
Calanus

私の推測では、問題はコントローラーではなく、program.csにあります。 WebHostの構成を変更する必要があります

var Host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://localhost:5000", "http://odin:5000", "http://192.168.1.2:5000")
.UseIISIntegration()
.UseStartup<Startup>()
.Build();

UseUrls行を追加しない限り、Kestrelはlocalhostの外部でリッスンしません。通常、KestrelはIISまたはNGNIXのようなリバースプロキシの背後にあり、外部URLにバインドする必要がないため、これは理にかなっています。

30
Feasoron

以下を実行するだけでWebHostを作成できます。これにより、kestrelへのリモート接続が可能になります。

var Host = WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://0.0.0.0:80")
                .UseStartup<Startup>()
                .Build();

次のコードを使用した後、APIにリモートでアクセスできなかったため、Windowsのコントロールパネル(コントロールパネル\ネットワークおよびインターネット\ネットワーク接続)でDockerによって作成されたネットワークアダプターを無効にする必要がありました

5

私の場合(.NETコア2.1)、Properties/launchSettings.jsonファイル。

applicationUrlを、このようなセミコロンで区切られた許可されたURLのリストに設定します

"applicationUrl": "https://localhost:5001;http://odin:5000"

これが誰かに役立つことを願っています。

4
Mendy

ローカルマシンで使用可能なマルチIPアドレスがある場合、より正確な方法があります。 UDPソケットを接続し、そのローカルエンドポイントを読み取ります。

string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
    socket.Connect("8.8.8.8", 65530);
    IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
    localIP = endPoint.Address.ToString();
}
0
FAHID

この問題を解決する別の方法は、「applicationhost.config」ファイルを編集することです。プロジェクトフォルダー-> .vs(非表示フォルダー)-> config「applicationhost.config」ファイルを開きます。 [サイト]セクションの[バインディング]ノードのサイト名= "プロジェクト名"に別のバインディングを追加し、次のように "bindingInformation"の "IP/Domain"でlocalhostを変更します。

<site name="project_name" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="D:\Projects\project_directory" />
    </application>
    <bindings>
     <binding protocol="http" bindingInformation="*:5000:localhost" />
     <binding protocol="http" bindingInformation="*:5000:192.168.1.2" />
     <binding protocol="http" bindingInformation="*:5000:odin" />
    </bindings>
</site>

visual Studioは管理者として実行する必要があることに注意してください。

0
Hamed Nikzad