나는 다음과 같은 API 컨트롤러가 있습니다MVC API 작업 및 System.Web.Http.AuthorizeAttribute - 게시 매개 변수를 가져 오는 방법?
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 방법에 널 (null)을오고 있다는 점이다. (나는 this 코드에 fetcher 기반으로했다.)
나는 이것이 작동해야한다고 생각하지만, 나는 그것을 얻을 수없는 것 같습니다. 내가 뭘 잘못하고 어떻게 게시 된 매개 변수를 가져 가야하는지에 대한 아이디어가 있습니까?
편집 :
내게 다음 구문 분석 할 수 JSON 형식으로 포스트 데이터를 가져using (StreamReader inputStream = new StreamReader(request.InputStream))
{
output = inputStream.ReadToEnd();
}
request.InputStream.Position = 0;
하지만 그때 내 전화는 비록하게 결코 : 나는 다음과 직접 포스트 데이터를 읽는 시도했다.
<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)"}
편집 : 나는 응답에 다음과 같은 예외를 얻을이 가능 ApiController
, System.Web.Http.AuthorizeAttribute
및 HttpPost
의 조합 버그가 있었던 것처럼 를 결국, (HttpGet
를 사용하는 경우이 작업을 수행) 보인다. 버그 보고서가 제출되었습니다.
참고이가 [APIController]이기 때문에 그 (http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v=vs.108).aspx) 및 [컨트롤러] (http://msdn.microsoft.com /en-us/library/system.web.mvc.controller(v=vs.108)) .aspx), 나는 System.Web.Mvc.AuthorizeAttribute가 아닌'System.Web.Http.AuthorizeAttribute'를 사용합니다. 나는 그것의'ControllerContext.RouteData.Values [ "folderId"]에 접근하려고 시도했지만 여전히 null을 리턴했다. – Kyle
@Zenox 내 업데이트 된 답변을 참조하십시오. – James
덕분에 나는 이것도 보았지만 아직도 운이 없다. 'actionContext.Request' 클래스는 [HttpRequestMessage] (http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage_methods)이며'GetRouteData' 메소드를 포함하지 않습니다. 또한 보면 : actionContext.ControllerContext.RouteData.Values에는 컨트롤러와 액션이라는 두 개의 키만 포함되어 있습니다. 최선의 선택은 inputStream에서 포스트 데이터를 읽는 것이라고 생각합니다. 나는 이것을 시도해 보았고 나의 게시물 데이터를 볼 수 있다는 것을 확인했지만 조금 해킹 된 것처럼 보였으므로 지금 당분간 찾고있다. – Kyle