私は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できます。
ここで不足している簡単なステップは何ですか。自宅でも職場でもこれを試しましたが、成功しませんでした。
私の推測では、問題はコントローラーではなく、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にバインドする必要がないため、これは理にかなっています。
以下を実行するだけでWebHostを作成できます。これにより、kestrelへのリモート接続が可能になります。
var Host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
次のコードを使用した後、APIにリモートでアクセスできなかったため、Windowsのコントロールパネル(コントロールパネル\ネットワークおよびインターネット\ネットワーク接続)でDockerによって作成されたネットワークアダプターを無効にする必要がありました
私の場合(.NETコア2.1)、Properties/launchSettings.json
ファイル。
applicationUrl
を、このようなセミコロンで区切られた許可されたURLのリストに設定します
"applicationUrl": "https://localhost:5001;http://odin:5000"
これが誰かに役立つことを願っています。
ローカルマシンで使用可能なマルチ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();
}
この問題を解決する別の方法は、「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は管理者として実行する必要があることに注意してください。