我有以下API Controller :

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

以下是我的基本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);
    }
}

我遇到的问题是folderId在onAuthorize方法中为空。 (我基于this代码获取了抓取程序)。

在我看来,这应该可行,但是我似乎无法实现。关于我做错了什么以及应该如何获取发布的参数的任何想法?

编辑:我尝试直接使用以下内容读取发布数据:
using (StreamReader inputStream = new StreamReader(request.InputStream))
{
    output = inputStream.ReadToEnd();
}
request.InputStream.Position = 0;

这使我可以解析JSON格式的发布数据,但随后我的调用却始终无法实现。我在响应中得到以下异常:
  <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)"}

编辑:
最后,似乎这可能是ApiControllerSystem.Web.Http.AuthorizeAttributeHttpPost组合的错误(使用HttpGet时确实起作用)。错误报告已提交。

最佳答案

AuthorizeAttribute应该有一个AuthorizationContext参数,而不是HttpActionContext一个,因此您应该能够访问RouteData,例如

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

更新

注意,您正在使用ApiController,因此正在使用Http.AuthorizeAttribute(解释了为什么没有AuthorizationContext的原因)。在这种情况下,您可以通过操作上下文获取RouteData,例如
var folderId = actionContext.Request.GetRouteData().Values["folderId"];

10-04 16:20