WebAPIをConsulサービスディスカバリに登録したいので、WebAPIのURL(例: http://service1.com )とヘルスチェックエンドポイント( http: //service1.com/health/check )。どうすればそのURLを取得できますか?
私はこのコードを見つけました:
var features = app.Properties["server.Features"] as FeatureCollection;
var addresses = features.Get<IServerAddressesFeature>();
var address = addresses.Addresses.First();
var uri = new Uri(address);
Localhost:5600ではなく127.0.0.1:16478を返します。 dotnet.exeが最初に使用するものと2番目のものはIISこれは5600を16478に転送します)と思います。Startup.csでlocalhost:5600を取得するにはどうすればよいですか?
本番環境には、パブリックアドレスを処理するリバースプロキシがあり、アプリケーション自体はパブリックに公開しないで、パブリックアドレスに注意する必要があるため、それは不可能だと思います。ただし、いくつかの回避策があります。
さて、この問題には複数の解決策があります。あなたの住所はこれです:
string myurl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}";
Localhost:5600の代わりに127.0.0.1:16478を返します
正解です。 1つはIISから、もう1つはdotnetからです。そのため、正しいURLを取得しようとして問題が発生しました。では、サービスがリバースプロキシの背後にある場合はどうなりますか? https: //en.wikipedia.org/wiki/Reverse_proxy
その後、サービスは直接インターネットに公開されませんが、特定のURLに対して行われたリクエストは、リバースプロキシからサービスに渡されます。また、元の要求の送信元を指定している追加ヘッダーを転送するようにリバースプロキシを構成できます。ほとんどのリバースプロキシはX-Forwarded-For
(一部のユーザーはX-Original-Host
など)。
したがって、RPに適切なヘッダーが設定されている場合、次のようなURLを取得できます。
url = url.RequestContext.HttpContext.Request.Headers["X-Forwarded-For"]
UrlはUrlHelperタイプです。このメソッドを簡略化するには、拡張メソッド(GetHostname(this UrlHelper url))を作成し、それをコントローラーまたはどこにでも使用できます。それが役に立てば幸い
[〜#〜] edit [〜#〜]:質問を読み直しました。 _Startup.cs
_でこれを行う方法を知りたいと思っていました。できますが、フォールバックは少なくなります。選択できるのは、設定またはraw DNS.GetHostName()
のみであり、理想的とは言えません。代わりに、サービスへのanyリクエスト時に、APIを遅延登録します。これは、contextがある場合です。その前は、サービスはJon Snowを何も知りません。 APIへの最初のリクエストはヘルスチェックになる可能性が高いので、それが領事への登録を開始します。
私が使用したソリューションは、フォールバックシナリオでの構成とヘッダーの組み合わせです。
最初に X-Forwarded-For ヘッダーに依存します。それが当てはまらない場合、または必要がある場合...構成にフォールバックできます。
これは、discoveryのユースケースで機能します。とはいえ、何らかの理由でリンクを生成する場合にも機能します(たとえば、ハイパーメディアの場合 JSON API または独自のREST実装)。
フォールバックは、再構成が発生していて、再デプロイメントを必要としない動的構成ソースがある場合に役立ちます。
ASP.NET Coreの世界では、クラスを作成し、それをコントローラーとサービスに注入できます。このクラスには、最初に(オーバーライドが必要かどうかを確認するために)構成を試行し、次にX-Forwarded-Forヘッダーを試行することがわかっているメソッドがあり、どちらも適切でない場合は、関連するURI部分を取得するために_HttpContext.Request
_にフォールバックします。
あなたがしていることは、「それがどこに住んでいるのか」についての状況認識をAPIに与えることにより、APIがコンテキストレスで復元力を持つ(変更する)ことを可能にすることです。