Ho il seguente controller API:MVC Api Action e System.Web.Http.AuthorizeAttribute - Come ottenere i parametri del post?
public class TestController : ApiController
{
[HttpPost]
[APIAuthorizeAttribute]
public IQueryable<Computers> ListOfComputersInFolder(Guid folderId)
{
return GetListOfComputersForFolder(folderId);
} // End of ListOfComputersInFolder
} // End of TestController
E la seguente è la mia base 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);
}
}
Il problema che sto avendo è che folderId
è venuta fuori nulla nel metodo onAuthorize. (Ho basato il fetcher sul codice this).
Mi sembra che questo dovrebbe essere di lavoro, ma io non riesco a farlo. Qualche idea su cosa sto facendo male e come dovrei fare per ottenere il parametro postato?
Edit: Ho provato a leggere i dati di post direttamente con il seguente:
using (StreamReader inputStream = new StreamReader(request.InputStream))
{
output = inputStream.ReadToEnd();
}
request.InputStream.Position = 0;
Il che mi ottiene i dati post in formato JSON, che ho potuto quindi analizzare, ma poi la mia chiamata non rende però. Ottengo la seguente eccezione nella risposta:
<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)"}
EDIT: Alla fine, sembra che questo potrebbe essere un bug con la combinazione di ApiController
, System.Web.Http.AuthorizeAttribute
e HttpPost
(funziona quando si utilizza HttpGet
). È stata presentata una segnalazione di errore.
noti che perché questo è un [APIController] (http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v=vs.108).aspx) e non un [controller] (http://msdn.microsoft.com /en-us/library/system.web.mvc.controller(v=vs.108) Aspx), io uso il 'System.Web.Http.AuthorizeAttribute' e non il' System.Web.Mvc.AuthorizeAttribute'. Ho provato ad accedere a 'ControllerContext.RouteData.Values [" folderId "] e ancora restituito null. – Kyle
@Zenox vedere la mia risposta aggiornata. – James
grazie Ho dato un'occhiata anche a questo, ma ancora senza fortuna. La classe 'actionContext.Request' è un [HttpRequestMessage] (http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage_methods) e non contiene un metodo' GetRouteData'. Inoltre se guardo: actionContext.ControllerContext.RouteData.Values contiene solo due chiavi: controller e azione. Penso che la mia migliore scelta di azione sarebbe quella di leggere i dati dei post da inputStream. Ho fatto una prova e ho confermato che posso vedere i miei dati postati, ma sembra un po 'hacky, quindi continuerò a cercare ora. – Kyle