我需要用户请求登录操作过滤器。
我对我们公司的web api项目进行了一些重构。它有自定义身份验证和授权,我不想更改此部分。
在重构之前,每个方法都会找到具有标题值的请求用户。
[CustomAuthorization]
public class ContentController : BaseApiController{
public HttpResponseMessage Post(FromBody request){
var token=GetFromHeader(request);
var user=FindUser(token);
Log.Write(user.Id,started,accessToken)
Log.WriteDetail(requestContent,user.Id,methodName,accessToken)
service.Action();
Log.Write(user.Id,finished,accessToken)
}
}
每个方法都有代码块显示上面的段落。每个控制器继承自BaseController,我添加了公共属性User和AccesToken等。 我在CustomAuthorization中的OnAuthorization方法上设置了这些属性。
public override void OnAuthorization(HttpActionContext actionContext)
{
var user=FindUserFromHeader();
var controller = (BaseApiController)actionContext.ControllerContext.Controller;
controller.User= user;
controller.ServiceTicket = accessToken;
actionContext.Request.Properties.Add(new KeyValuePair<string, object>("User", user));
actionContext.Request.Properties.Add(new KeyValuePair<string, object>("AccessToken", accessToken));
}
现在,我删除了每种方法都找到用户块。
我想删除每个方法中的日志记录。我添加了自定义ActionFilterAttribute,但我无法获取方法请求内容。
在我的CustomLogAttribute:ActionFilterAttribute中,我得到Post数据但我无法捕获 GET 方法请求内容。如何获得 POST 或 GET 方法。
public override void OnActionExecuting(HttpActionContext actionContext)
{
object _customer;
object _tranId;
object _serviceTicket;
actionContext.Request.Properties.TryGetValue("Customer", out _user);
actionContext.Request.Properties.TryGetValue("AccessToken", out _serviceTicket);
User= (User)_user;
ServiceTicket = _serviceTicket.ToString();
using (var stream = new MemoryStream())
{
var context = (HttpContextBase)actionContext.Request.Properties["MS_HttpContext"];
context.Request.InputStream.Seek(0, SeekOrigin.Begin);
context.Request.InputStream.CopyTo(stream);
string requestBody = Encoding.UTF8.GetString(stream.ToArray());
}
var content = actionContext.Request.Content.ReadAsStringAsync().Result;
}