MVC Api Action&System.Web.Http.AuthorizeAttribute - 如何获取帖子参数?

Kyl*_*yle 5 c# asp.net-mvc post controller

我有以下API控制器:

public class TestController : ApiController
{
    [HttpPost]
    [APIAuthorizeAttribute]
    public IQueryable<Computers> ListOfComputersInFolder(Guid folderId)
    {
        return GetListOfComputersForFolder(folderId);
    } // End of ListOfComputersInFolder
} // End of TestController 
Run Code Online (Sandbox Code Playgroud)

以下是我的基本知识APIAuthorizeAttribute.

public class APIAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var Request = System.Web.HttpContext.Current.Request;
        var folderId = Request.RequestContext.RouteData.Values["folderId"] ?? Request.Params["folderId] as string;
        if(null == folderId)
        {
            folderId = actionContext.ControllerContext.RouteData.Values["folderId"];
        }

        base.OnAuthorization(actionContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题folderId是在onAuthorize方法中出现null.(我基于代码的fetcher ).

在我看来,这应该工作,但我似乎无法得到它.关于我做错了什么以及如何获取发布参数的任何想法?

编辑:我尝试使用以下内容直接阅读帖子数据:

using (StreamReader inputStream = new StreamReader(request.InputStream))
{
    output = inputStream.ReadToEnd();
}
request.InputStream.Position = 0;
Run Code Online (Sandbox Code Playgroud)

这让我得到了JSON格式的帖子数据然后我可以解析,但是我的呼叫从来没有成功.我在Response中得到以下异常:

  <h2>500 - Internal server error.</h2>
  <h3>There is a problem with the resource you are looking for, and it cannot be displayed.

at System.Json.JXmlToJsonValueConverter.JXMLToJsonValue(Stream jsonStream, Byte[] jsonBytes)\u000d\u000a   at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c__DisplayClass7.<OnReadFromStreamAsync>b__6()\u000d\u000a   at System.Net.Http.Internal.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)"}
Run Code Online (Sandbox Code Playgroud)

编辑:最后,似乎这可能是组合的一个错误ApiController,System.Web.Http.AuthorizeAttribute并且HttpPost(它在使用时确实有效HttpGet).已提交错误报告.

Jam*_*mes 7

AuthorizeAttribute应该有一个AuthorizationContext参数,而不是HttpActionContext一个,从你应该能够访问RouteData

public override void OnAuthorization(AuthorizationContext filterContext)
{
    var folderId = filterContext.RouteData.Values["folderId"];
    ...
}
Run Code Online (Sandbox Code Playgroud)

更新

注意到你正在使用ApiController和使用Http.AuthorizeAttribute(解释为什么你没有AuthorizationContext).在这种情况下,您可以RouteData通过动作上下文获取例如

var folderId = actionContext.Request.GetRouteData().Values["folderId"];
Run Code Online (Sandbox Code Playgroud)

  • 请注意,因为这是[APIController](http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v = vs.108).aspx)而不是[Controller]( http://msdn.microsoft.com/en-us/library/system.web.mvc.controller(v=vs.108).aspx),我使用`System.Web.Http.AuthorizeAttribute`而不是` System.Web.Mvc.AuthorizeAttribute`.我尝试访问它的`ControllerContext.RouteData.Values ["folderId"],它仍然返回null. (3认同)