webapi-捕获请求标头的自定义值提供程序

时间:2018-08-14 10:23:58

标签: asp.net-mvc asp.net-web-api asp.net-web-api2

在ASP.NET Web-API中,我试图借助本文提到的自定义值提供程序技术来读取Http请求标头信息

https://www.c-sharpcorner.com/article/fetch-header-information-using-customvalueprovider-in-asp-ne/

现在,此技术可以正常工作,并且为我提供了所需标头密钥的值。但我想修改API控制器操作方法签名,以获得标头的整个字典对象。

我的API控制器方法看起来像这样:-

   [HttpPost]
   [Route("user-documents")]
  public async Task<IHttpActionResult> GetUserDocuments([ValueProvider(typeof(CustomHeaderProviderFactory))] string Client, SearchCriteria incomingObj)
        {    .... Logic ...... }

这是CustomHeaderProviderFactory的类。

  public class CustomHeaderProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(HttpActionContext actionContext)
        {
            return new CustomHeaderValueProvider(actionContext);
        }
    }


    public class CustomHeaderValueProvider : IValueProvider
    {

        public Dictionary<string, string> objCollection;
        public CustomHeaderValueProvider(HttpActionContext context)
        {
            objCollection = new Dictionary<string, string>();

            foreach (var item in context.Request.Headers)
            {
                objCollection.Add(item.Key, string.Join(string.Empty, item.Value));
            }
        }

        public bool ContainsPrefix(string prefix)
        {
            return objCollection.Keys.Contains(prefix);
        }

        public ValueProviderResult GetValue(string key)
        {
            if (key == null)
                throw new Exception("NullReferenceException");

            if (objCollection.TryGetValue(key, out string resultValue))
            {
                return new ValueProviderResult(resultValue, resultValue, System.Globalization.CultureInfo.InvariantCulture);
            }


            return null;
        }

    }

我想更改API方法的签名,以便可以访问API方法主体内的完整请求标头对象。如果我可以访问API方法中的完整objCollection,那就太好了。因为我会在方法内部使用其他标头值。

请建议如何更改此代码。

1 个答案:

答案 0 :(得分:0)

创建一个自定义属性,并在Request.Properties []中设置一个键。您将可以通过控制器操作访问该信息

public class MyNewAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        actionContext.Request.Properties[<yourkey] = <your value>;
    }
}

但是,为什么在控制器操作中需要此信息?如果您在请求中需要此信息,为什么不将其包括在调用的有效负载中而不是标头中?