0

私は現在、mvc web api サーバーと mvc 4 クライアントで構成される小さなアプリケーションを作成していますが、すでに数日間頭を悩ませている問題に直面しました。

以下を含む ContactsController があります。

[HttpPost]
    public ActionResult AddContact(ContactModel model, HttpPostedFileBase image)
    {
        return ActionWrapper(() =>
        {
            if (model.InitializeFromCookie())
            {
                if (image != null)
                {
                    model.ImageMimeType = image.ContentType;
                    model.Picture = new byte[image.ContentLength];
                    image.InputStream.Read(model.Picture, 0, image.ContentLength);
                }

                PostObject("api/contacts/postcontact", model);
                RefreshCookie();
                return RedirectToAction("Contacts", "Contacts");
            }

            else
            {
                return JsonRedirectResult(Url.Action("Login", "Users"));
            }
        });
    }

モデルは AuthorizationContent から派生します。投稿オブジェクト メソッド:

[NonAction]
        protected object PostObject(string apiUrl, object obj, object additionalData = null)
        {
            var query = additionalData != null ? additionalData.GetQueryString() : string.Empty;
            apiUrl += query;
            var action = _client.PostAsJsonAsync(apiUrl, obj);
            action.Wait();

            if (!action.Result.IsSuccessStatusCode)
            {
                var code = action.Result.StatusCode;
                var error = action.Result.ReasonPhrase;
                throw new ServerSideException(code, error);
            }

            else
            {
                return action.Result.Content.ReadAsAsync<object>().Result;
            }
        }

このメソッドは、webapi コントローラーのメソッドを呼び出そうとしています:

[AuthorizedOnly, HttpPost]
    public void PostContact([FromBody]AuthorizationContent item, User authorizedUser)
    {
        var realItem = Mapper.Map<ContactModel, Contact>((ContactModel) item);
        _contactService.AddContact(authorizedUser, realItem);
    }

フィルター:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
class AuthorizedOnly : ActionFilterAttribute
{
    private ISessionService _sessionService;
    private Session _userSession;

    public ISessionService SessionService
    {
        get { return _sessionService ?? (_sessionService = NinjectWebCommon.Kernel.Get<ISessionService>()); }
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var auth = actionContext.ActionArguments.Values.FirstOrDefault() as AuthorizationContent;

        if (auth == null)
        {
            throw new UnauthorizedException();
        }

        else
        {
            var user = SessionService.GetMemberBySessionCredentials(auth.Token, auth.UserName);
            _userSession = user.Session;

            if (SessionService.IsSessionValid(_userSession))
            {
                actionContext.ActionArguments["authorizedUser"] = user;
                base.OnActionExecuting(actionContext);
            }

            else
            {
                throw new UnauthorizedException();
            }
        }
    }

コードは取得アクションに対しては正常に機能しますが、上記のように投稿しようとすると、サーバー側の例外が常に発生します

{StatusCode: 400、ReasonPhrase:

「複数のパラメーター ('item' および 'authorizedUser') をリクエストのコンテンツにバインドできません。」、バージョン: 1.1、コンテンツ: System.Net.Http.StringContent、ヘッダー: { Content-Type: text/plain; charset=utf-8 } }

質問-authorizedUserがフィルターから来て、モデルバインダーがリクエストコンテンツでそれを探すべきではないことをどのように述べることができますか? 下手な英語で申し訳ありませんが、よろしくお願いします!

4

1 に答える 1

0

本文から読み取らないということ以外は何もしない空のパラメーターバインディングを使用できます。Web API で本文を読み取ることができるパラメーターが 1 つだけである理由については、このブログ投稿を参照してください。パラメーター バインディングは、構成でグローバルに登録するか、その属性を定義できます。パラメータバインディングのサンプルコードは次のとおりです。

public class EmptyParameterBinding : HttpParameterBinding
{
    public EmptyParameterBinding(HttpParameterDescriptor descriptor)
        : base(descriptor)
    {
    }

    public override bool WillReadBody
    {
        get
        {
            return false;
        }
    }

    public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        return Task.FromResult(0);
    }
}
于 2013-02-23T02:08:31.363 に答える