自己ホスティングと Web ホスティングを (同時に) サポートするためのベスト プラクティスはありますか?
私が解決しなければならなかった多くの問題があります。HttpContext.Current が設定されておらず、セルフホスティングでは GlobalConfiguration にアクセスできないため、セルフホスティングでは autofac が正しく機能しません。
他に注意すべき問題はありますか?
自己ホスティングと Web ホスティングを (同時に) サポートするためのベスト プラクティスはありますか?
私が解決しなければならなかった多くの問題があります。HttpContext.Current が設定されておらず、セルフホスティングでは GlobalConfiguration にアクセスできないため、セルフホスティングでは autofac が正しく機能しません。
他に注意すべき問題はありますか?
この回答をご覧ください:https ://stackoverflow.com/a/13285693/463785これは、ホスティングレイヤーに依存しない方法でソリューションを構築する方法を示しています。
基本的に、ASP.NET Web APIロジックを別のプロジェクトに配置し、@ DarrelMillerが提案したように、そのプロジェクトでホスティング固有のコンテキストを使用しないでください。System.Web
このプロジェクト内で不要なアセンブリ(例:)を参照することさえしないでください。ただし、コンシューマーのIPアドレスを取得するなど、ホスティングレイヤー固有のニーズがいくつかあります(これは、ASP.NET Web APIが提供するものでは実行できません)。このような場合、コアAPIとホスティングレイヤーの間で何らかの契約を結んでください。
たとえば、以下の1つは、リクエストごとにコンシューマーのIPアドレスを設定するメッセージハンドラーであり、WebHostプロジェクトを介してこのメッセージハンドラーを登録しました。
public class UserHostAddressSetterHandler : DelegatingHandler {
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
request.Properties[ApiCommonRequestKeys.UserHostAddressKey] = request.GetUserHostAddress();
return base.SendAsync(request, cancellationToken);
}
}
internal static class HttpRequestMessageExtensions {
internal static HttpContextBase GetHttpContext(this HttpRequestMessage request) {
return (HttpContextBase)request.Properties[Constants.MS_HttpContextKey];
}
internal static string GetUserHostAddress(this HttpRequestMessage request) {
return request.GetHttpContext().Request.UserHostAddress;
}
}
Properties[ApiCommonRequestKeys.UserHostAddressKey]
次に、APIコアレイヤーで、ホスティングレイヤーがIPアドレスを設定し、HttpRequestMessage
インスタンスを介していつでもIPアドレスに到達できることを知っています。
このプロジェクトをご覧ください:https ://github.com/tugberkugurlu/PingYourPackageこれは、後でホスティングに依存しない方法で構造化された、優れたASP.NETWebAPIプロジェクトです。あなたにヒントを与えるかもしれません。
どの Web API プロジェクトでも HttpContext.Current を使用しないでください。必要なものはすべて HttpRequestMessage.Properties にある必要があります。セルフホストでの DI の問題は認識していませんが、Unity をセルフホストで問題なく使用できることは知っています。
WebAPI には別のパイプラインがあり、HTTPHandler を使用しています。それはより低いレベルにあります。したがって、HTTPContext.Current を使用することはお勧めできません。