6

ユーザーを承認するために、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);
    }
}
4

1 に答える 1

8

これは、HttpContent が ActionFilter の前にフォーマッターによって読み取られたためです。Web API では、コンテンツを 1 回だけ読み取ることができます。したがって、もう一度読むことはできません。

ここに考えられる解決策があります。まず、アクション パラメーターを FormDataCollection として作成します。

    [RequireAuthorization]
    public HttpResponseMessage PostTodo(FormDataCollection formData)
    {
        Todo todo = formData.ReadAs<Todo>();
        // ...

次に、コードで 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);
    }
于 2012-09-23T10:26:21.030 に答える