2016-06-21 29 views
1

現在、ユーザーがLastActivityタイムスタンプごとに要求を行うと、私のデータベースを更新できるカスタムAPIをWeb APIに書き込もうとしています。これを行うには、WebHostHttpRequestContextで利用可能なユーザー名にアクセスする必要があり、デバッグしていくつかのレイヤーに移動するときに表示できますが、コードでアクセスする方法を理解できないようです。Web API Asp.netのカスタムフィルターでWebHostHttpRequestContextを取得

このオブジェクトにどのようにアクセスして値を取得することができますか?ここまで私がこれまで行ってきたことは次のとおりです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http.Filters; 
using MyWebAPI.Models.DAL; 

namespace MyWebAPI.App_Service 
{ 
    public class MyActionFilter : System.Web.Http.Filters.ActionFilterAttribute 
    { 
     public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
     { 

      var principal = actionExecutedContext.Response.Content; 

      //using (var db = new databaseContext()) 
      //{ 
      // var dbUser = (from b in db.AspNetUsers 
      //     where b.UserName == principal.Identity.Name 
      //     select b).First(); 

      // dbUser.LastActivity = DateTime.Now; 
      // db.SaveChanges(); 
      //} 
     } 
    } 
} 

答えて

2

あなたが後にしているものがプリンシパルの場合は、 HttpActionExecutedContext.ActionContext.RequestContext.Principalからアクセスしてみてください。要求が認証され、ユーザープリンシパルが要求に割り当てられている場合は、この値を移入する必要があります。

namespace MyWebAPI.App_Service { 
    public class MyActionFilter : System.Web.Http.Filters.ActionFilterAttribute { 
     public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext) { 

      var principal = actionExecutedContext.ActionContext.RequestContext.Principal; 
      if(principal != null) { 
       using (var db = new databaseContext()) { 
        var dbUser = (from b in db.AspNetUsers 
           where b.UserName == principal.Identity.Name 
           select b).First(); 

        dbUser.LastActivity = DateTime.Now; 
        db.SaveChanges(); 
       } 
      } 
     } 
    } 
} 
+0

これは素晴らしいですありがとう、私は今それをしようとする機会を持っていますが、明日ますが、これはまさに私が今日の感謝を探していたもののように感じていません! – tokyo0709

0

クラスは内部的ですが、あなたはダイナミックとしてWebHostHttpContextオブジェクトを扱い、actionExecutedContext.Request.Properties [「MS_RequestContext」]からそれを得ることができます。

次のコードは、リクエストコンテキスト(たとえば、POSTボディデータを取得する)から元のHttpRequestWrapperが必要なときに機能しました。

dynamic requestContext = actionContext.Request.Properties["MS_RequestContext"]; 
var requestWrapper = (HttpRequestWrapper)requestContext.Context.Request; 
関連する問題