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