MVC Action Api & Système.Web.Http.AuthorizeAttribute - Comment obtenir les paramètres post?
J'ai l'API suivante Contrôleur:
public class TestController : ApiController
{
[HttpPost]
[APIAuthorizeAttribute]
public IQueryable<Computers> ListOfComputersInFolder(Guid folderId)
{
return GetListOfComputersForFolder(folderId);
} //End of ListOfComputersInFolder
} //End of TestController
Et celle-ci est ma base de 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);
}
}
Le problème que je rencontre est que folderId
est en train de sortir la valeur null dans la onAuthorize méthode. (J'en fonction de l'outil de récupération sur cette code).
Il me semble que cela devrait fonctionner, mais je n'arrive pas à l'obtenir. Toutes les idées sur ce que je fais de mal et comment je dois faire pour avoir la posté paramètre?
Edit: j'ai essayé de lire le post de données directement avec les éléments suivants:
using (StreamReader inputStream = new StreamReader(request.InputStream))
{
output = inputStream.ReadToEnd();
}
request.InputStream.Position = 0;
Qui me met le post de données au format JSON qui je pourrais ensuite d'analyser, mais alors que mon appel ne se rend jamais bien. J'obtiens l'exception suivante dans la Réponse:
<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:
En fin de compte, il semble que cela pourrait être un bug avec la combinaison de ApiController
, System.Web.Http.AuthorizeAttribute
et HttpPost
(il ne fonctionne pas lors de l'utilisation de HttpGet
). Un rapport de bug a été soumis.
OriginalL'auteur Kyle | 2012-08-31
Vous devez vous connecter pour publier un commentaire.
La AuthorizeAttribute devrait avoir un AuthorizationContext paramètre plutôt qu'une
HttpActionContext
, à partir de ce que vous devriez être en mesure d'accéder à laRouteData
par exempleMise à jour
Remarqué que vous êtes en utilisant
ApiController
et en tant que tel à l'aide deHttp.AuthorizeAttribute
(explique pourquoi vous n'avez pas deAuthorizationContext
). Dans ce cas, vous pouvez obtenir leRouteData
via le contexte d'action par exempleSystem.Web.Http.AuthorizeAttribute
et pas leSystem.Web.Mvc.AuthorizeAttribute
. J'ai essayé de l'accès à son `ControllerContext.RouteData.Valeurs["id de dossier"] et il retourna encore nulle.voir ma réponse mis à jour.
merci, j'ai pris un coup d'oeil à ce que bien, mais toujours pas de chance. Le
actionContext.Request
classe est un HttpRequestMessage et ne contient pas deGetRouteData
méthode. Aussi, si je regarde: actionContext.ControllerContext.RouteData.Les valeurs qu'il ne contient que deux touches: contrôleur et l'action. Je pense que mon meilleur choix de l'action serait de lire le post de données à partir de l'inputStream. J'ai donné un essai et a confirmé que je peux voir mon post de données, mais la semble un peu hacky, donc je vais continuer à chercher pour l'instant.la GetRouteData est une extension de la méthode de
HttpRequestMessage
, assurez-vous d'inclure une référence à laSystem.Web.Http
espace de noms.êtes-vous à l'aide de
HttpPost
? Juste pour tester, j'ai passerHttpGet
et maintenant, je suis en mesure d'obtenir les données viaSystem.Web.HttpContext.Current.Request["folderId"]
.OriginalL'auteur James
J'ai également rencontré ce problème.
Pour le contourner, j'ai écrit la méthode suivante que j'appelle de l'intérieur de la OnAuthorization méthode:
Ce code repose sur les hypothèses suivantes:
La clé que vous l'extraction correspond à un nom d'argument à la méthode d'action.
Le type de paramètre que vous êtes l'obtention aura un convertisseur valable pour le type.
Vous n'utilisez pas toute la liaison personnalisée ou de mise en forme sur le paramètre.
Dans le scénario que je suis en utilisant le code je ne suis qu'attendent les types simples comme les Guid, Boolean, String, etc et peut être personnalisé selon vos exigences.
La méthode d'extension GetQueryNameValuePairs fait partie du Système.Net.Http.HttpRequestMessageExtensions classe et à lire une chaîne de requête /formulaire de données.
Exemple d'utilisation:
OriginalL'auteur jim.taylor.1974
Vous pouvez donner à cette méthode d'extension de l'essayer: (c'est un extrait du code du travail)
Je suis d'accord avec James réponse, vous avez accès à le contexte de la demande via le actionContext dans ce scénario.
OriginalL'auteur Shelakel
Si la demande est contenttype est
application/json;charset=utf-8
L'action API peut récupérer les Données Post comme suit:
OriginalL'auteur user7079322