如何获取用于登录 Web api 的所有 headers 的列表

How to get a list of all the headers for logging in web api

我想记录所有请求 header。我已经有了这样的过滤器。 现在如何获取所有请求 header 以便我可以记录它们?

public class LogApiFilter : AbstractActionFilter
{
    private readonly ILog m_Log;

    public override bool AllowMultiple
    {
        get
        {
            return true;
        }
    }

    public LogApiFilter(ILog iLog)
    {
        if (iLog == null)
            throw new ArgumentNullException("log instance injected is null.");
        m_Log = iLog;

    }
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        base.OnActionExecuted(actionExecutedContext);
    }

    public override void OnActionExecuting(HttpActionContext context)
    {
        m_Log.Debug("Web api Controller Name and Action method Name: " 
            + context.ActionDescriptor.ControllerDescriptor.ControllerName 
            + ", " + context.ActionDescriptor.ActionName);
        base.OnActionExecuting(context);
    }
}

好的,为了我自己和其他人的记录,我想出了这个。有没有更好的方法请大家指教

    private string GetRequestHeaders(HttpActionContext context)
    {
        // Note you can replace the type names sucha as string, HttpRequestHeaders, List<KeyValuePair<string, IEnumerable<string>>>
        // with var keyword where ever possible for readability.
        string headerString = string.Empty;
        HttpRequestHeaders requestHeaders = context.Request.Headers;
        List<KeyValuePair<string, IEnumerable<string>>> headerList = requestHeaders.ToList();
        foreach (var header in headerList)
        {
            string key = header.Key;
            List<string> valueList = header.Value.ToList();
            string valueString = string.Empty;
            foreach (var v in valueList)
            {
                valueString = valueString + v + "-";
            }
            headerString = headerString + key + ": " + valueString + Environment.NewLine;
        }

        return headerString;
    }

可以从问题中的操作过滤器调用上述方法。我从方法 OnActionExecuting(HttpActionContext context).

调用它

我正在使用 ninject 作为 di,所以我是这样配置的。

kernel.BindHttpFilter<LogApiFilter>(System.Web.Http.Filters.FilterScope.Global);
kernel.BindHttpFilter<ApiExceptionFilterAttribute>(System.Web.Http.Filters.FilterScope.Global);
kernel.BindFilter<LogMvcFilter>(System.Web.Mvc.FilterScope.Global, 0);