How to access the current HttpRequestMessage object globally?

断了今生、忘了曾经 提交于 2019-11-28 08:53:25

It's not impossible as I have just recently found out. It's actually added into the Items property of the current HttpContext (if there is one) =[

HttpRequestMessage httpRequestMessage = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage

Edit:

This is as of WebAPI v2 .. I cannot be sure of previous versions.

Why not do what the Web API team have done with their CreateResponse method? Make it an extension method of Controller. That way you can still have the code in a separate class library, but your method will have access to the controller instance and therefore all the Configuration information.

And on a slightly different note, I would suggest you look into some of the standardization efforts for error responses rather than inventing your own.

e.g.:

You can try to archieve it with Autofac, eg

public class MyPrincipal : IPrincipal
    {
        private readonly IPrincipal principal_;

        public MyPrincipal(ILifetimeScope scope)
        {
            if (scope.Tag == null || scope.Tag != MatchingScopeLifetimeTags.RequestLifetimeScopeTag)
            {
                throw new Exception("Invalid scope");
            }

            principal_ = scope.Resolve<HttpRequestMessage>().GetRequestContext().Principal;
        }
}

This class can be registred with InstancePerRequest lifetime.

   builder.RegisterType<MyPrincipal>().As<IPrincipal>().InstancePerRequest();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!