我尝试使用简单的键/值对设置标头,并希望从我的API中读取此标题。 所以这是我来自客户的电话:
public async Task<T> Auth_GetAsync<T>(string path)
{
var client = BaseHttpClient;
var request = new HttpRequestMessage
{
RequestUri = new Uri(Path.Combine(client.BaseAddress.AbsoluteUri, path)),
Method = HttpMethod.Get,
Headers = { {"key", "param"} }
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(RequestHeader));
var task = await client.SendAsync(request);
return task.IsSuccessStatusCode
? JsonConvert.DeserializeObject<T>(await task.Content.ReadAsStringAsync())
: default(T);
}
当我试图在我的动作中读取标题时,我完全得到它(使用我的键/值对)
public async Task<IEnumerable<string>> GetAsync()
{
var i = Request.Headers;
return await Task.Run(() => new[] { "value1", "value2" });
}
当我尝试使用ActionFilterAttribute和/或IAuthorizationFilter执行此操作时,我的标头始终包含其他键,但从不包含我的键/值对。 这是我的属性:
public class RequiresKeyAttribute : ActionFilterAttribute, IAuthorizationFilter
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var req = filterContext.HttpContext.Request;
var auth = req.Headers["key"]; // this is null here
}
public void OnAuthorization(AuthorizationContext filterContext)
{
var i = filterContext.HttpContext.Request.Headers;
}
}
我的目标是,actionfilter检查是否在标题中设置了密钥。如果密钥已设置并验证,我并不总是想检查我的操作,...
我做错了吗?或者有解决方案吗?
答案 0 :(得分:1)
也许你继承了来自MVC的错误ActionFilterAttribute
,而不是Web Api,因为WebApi使用HttpActionContext
,而不是ActionExecutingContext
,如下所示:
public override void OnActionExecuting(HttpActionContext actionContext)
{
//code
}
您只需使用WebApi中的System.Web.Http.Filters.ActionFilterAttribute
,就可以了。