kko*_*yik 5 c# asp.net-mvc c#-4.0 asp.net-mvc-3 asp.net-web-api
我为我的web api创建了一个ActionFilterAttribute以授权人员.通过RequestUri获取accessToken是可以的,但是我想在表单数据中发送它.在ActionFilterAttribute的onActionExecuting方法中读取Request.Content时,服务器始终具有空结果.我怎么解决这个问题?代码如下所示:
public class RequireAuthorization : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
actionContext.Request.Content.ReadAsStringAsync().ContinueWith((t) =>
{
try
{
//query will result in empty string
string query = t.Result;
string UserID = HttpUtility.ParseQueryString(query).Get("UserID");
string accessToken = HttpUtility.ParseQueryString(query).Get("AccessToken");
UserRepository repository = new UserRepository();
repository.IsTokenValid(Convert.ToInt32(UserID), accessToken);
}
catch (Exception ex)
{
var response = new HttpResponseMessage
{
Content =
new StringContent("This token is not valid, please refresh token or obtain valid token!"),
StatusCode = HttpStatusCode.Unauthorized
};
throw new HttpResponseException(response);
}
});
base.OnActionExecuting(actionContext);
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为格式化程序在ActionFilter之前已读取HttpContent。Web API只允许读取一次内容。因此,您将无法再次阅读。
这是您可能的解决方案。首先,将操作参数设置为FormDataCollection:
[RequireAuthorization]
public HttpResponseMessage PostTodo(FormDataCollection formData)
{
Todo todo = formData.ReadAs<Todo>();
// ...
Run Code Online (Sandbox Code Playgroud)
然后,通过代码在ActionFilter中获取它:
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
var formData = actionContext.ActionArguments["formData"] as FormDataCollection;
if (formData != null)
{
var userID = formData.Get("UserID");
var accessToken = formData.Get("AccessToken");
// authorize
}
base.OnActionExecuting(actionContext);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8116 次 |
| 最近记录: |