Tengo el siguiente controlador de API:MVC Api Action & System.Web.Http.AuthorizeAttribute - ¿Cómo obtener los parámetros de la publicación?
public class TestController : ApiController
{
[HttpPost]
[APIAuthorizeAttribute]
public IQueryable<Computers> ListOfComputersInFolder(Guid folderId)
{
return GetListOfComputersForFolder(folderId);
} // End of ListOfComputersInFolder
} // End of TestController
Y la siguiente es mi APIAuthorizeAttribute
básica.
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);
}
}
El problema que estoy teniendo es que folderId
está saliendo nula en el método onAuthorize. (Basé el buscador en el código this).
Me parece que esto debería estar funcionando, pero parece que no puedo conseguirlo. ¿Alguna idea sobre lo que estoy haciendo mal y cómo debo obtener el parámetro publicado?
Editar: Traté de leer los datos enviados directamente con lo siguiente:
using (StreamReader inputStream = new StreamReader(request.InputStream))
{
output = inputStream.ReadToEnd();
}
request.InputStream.Position = 0;
Lo que me pone los datos de correos en formato JSON que luego se pudo analizar, pero entonces mi llamada nunca lo hace sin embargo. Me da la siguiente excepción en la Respuesta:
<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: Al final, parece que esto podría ser un error con la combinación de ApiController
, System.Web.Http.AuthorizeAttribute
y HttpPost
(que hace el trabajo cuando se utiliza HttpGet
). Se ha enviado un informe de error.
Tenga en cuenta que debido a esto es un [APIController] (http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller(v=vs.108).aspx) y no a [Controller] (http://msdn.microsoft.com /en-us/library/system.web.mvc.controller(v=vs.108) .aspx), utilizo 'System.Web.Http.AuthorizeAttribute' y no' System.Web.Mvc.AuthorizeAttribute'. Traté de acceder a su 'ControllerContext.RouteData.Values [" folderId "] y todavía devolvió nulo. – Kyle
@Zenox ver mi respuesta actualizada. – James
gracias Eché un vistazo a esto también, pero aún no tuve suerte. La clase 'actionContext.Request' es un [HttpRequestMessage] (http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage_methods) y no contiene un método' GetRouteData'. Además, si miro: actionContext.ControllerContext.RouteData.Values, solo contiene dos claves: controlador y acción. Creo que mi mejor opción de acción sería leer los datos de la entrada de inputStream. Lo intenté y confirmé que podía ver mis datos de publicación, pero parece un poco raro, así que voy a seguir buscando ahora. – Kyle