This is because HttpContent was read by formatting before the ActionFilter. The web API allows you to read only once. Therefore, you cannot read it again.
Here is a possible solution for you. First, make your action parameter as FormDataCollection:
[RequireAuthorization]
public HttpResponseMessage PostTodo(FormDataCollection formData)
{
Todo todo = formData.ReadAs<Todo>();
Then enter it in the ActionFilter by code:
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");
}
base.OnActionExecuting(actionContext);
}