と
HttpContext.Current.GetOwinContext()
Webアプリケーションで現在のOwinContextを受け取ることができます。
OwinContext.Set<T>
およびOwinContext.Get<T>
リクエスト全体に存在するはずの値を保存します。
これで、webおよびconsole owinアプリケーション内で使用する必要のあるコンポーネントができました。このコンポーネントでは、現在、httpコンテキストにアクセスできません。
アプリケーションでは、スレッド機能と非同期機能を使用しています。
私もCallContext
を使用してみましたが、一部のシナリオではデータが失われているようです。
では、どうすれば現在のOwinContextにアクセスできますか?または、私が自分の価値観を発揮できる他のコンテキストはありますか?
WebApi AuthorizationFilterを使用して以下を実行します。また、WebApiのapp.UseWebApi(app)などのミドルウェアをサポートしている場合は、MVCコントローラーとWebApiコントローラーコンテキストでもこれを実行できるはずです。
コンポーネントはOwinパイプラインをサポートする必要があります。サポートしない場合、正しいスレッドのコンテキストを取得する方法がわかりません。
だから多分あなたはあなた自身のカスタムを作成することができます
owinスタートアップでapp.Use()を使用してこのコンポーネントを結び付けます。
詳細 ここ
マイプロパティミドルウェア
public class PropertiesMiddleware : OwinMiddleware
{
Dictionary<string, object> _properties = null;
public PropertiesMiddleware(OwinMiddleware next, Dictionary<string, object> properties)
: base(next)
{
_properties = properties;
}
public async override Task Invoke(IOwinContext context)
{
if (_properties != null)
{
foreach (var prop in _properties)
if (context.Get<object>(prop.Key) == null)
{
context.Set<object>(prop.Key, prop.Value);
}
}
await Next.Invoke(context);
}
}
Owinスタートアップ構成
public void Configuration(IAppBuilder app)
{
var properties = new Dictionary<string, object>();
properties.Add("AppName", AppName);
//pass any properties through the Owin context Environment
app.Use(typeof(PropertiesMiddleware), new object[] { properties });
}
WebApi Filter
public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext context, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
var owinContext = context.Request.GetOwinContext();
var owinEnvVars = owinContext.Environment;
var appName = owinEnvVars["AppName"];
}
幸せなコーディング!