ASP.NET de Base Ne peut pas Lire du Corps de la Requête
J'ai travaillé sur ASP.NET Base de quelques semaines. Je cherche à réaliser quelque chose de basé sur ce blog:
Microservices
Mon project.json
est comme suit:
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.Diagnostics": "1.0.0-rc1-*",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"EntityFramework.Core": "7.0.0-rc1-final",
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",
"Microsoft.AspNet.Mvc.Formatters.Json": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final",
"System.Security.Cryptography.Algorithms": "4.0.0-beta-23516"
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnxcore50": {
"dependencies": {
}
}
},
"exclude": [
"wwwroot",
"node_modules"
],
"publishExclude": [
"**.user",
"**.vspscc"
]
}
Et ConfigureServices
méthode dans Startup.cs
est comme suit:
public void ConfigureServices(IServiceCollection services)
{
//Registering Authorization Database
AutorizationAccessRegisteration.RegisterComponents(services, Configuration);
services.AddMvcCore()
.AddJsonFormatters(a => a.ContractResolver = new CamelCasePropertyNamesContractResolver());
//Add cors built in support.
services.AddCors();
services.AddMvcCore().AddApiExplorer();
//Add MVC for supporting WebApi requests
#region MVC Add
services.AddMvc();
services.AddMvc().AddMvcOptions(options =>
{
options.RespectBrowserAcceptHeader = true;
//Input Formatters.
options.InputFormatters.Clear();
var jsonInputFormatter = new JsonInputFormatter()
{
SerializerSettings = new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
,
DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate,
NullValueHandling = NullValueHandling.Ignore
}
};
options.InputFormatters.Add(jsonInputFormatter);
//Output formater
//as part of get/post request, set the header Accept = application/json or application/xml
var jsonOutputFormatter = new JsonOutputFormatter();
jsonOutputFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonOutputFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore;
options.OutputFormatters.Insert(0, jsonOutputFormatter);
options.OutputFormatters.Insert(1, new XmlDataContractSerializerOutputFormatter());
});
#endregion
}
Et voici mon Confiure
méthode de Démarrage.cs:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
}
else if (env.IsStaging())
{
}
else if (env.IsProduction())
{
}
app.UseIISPlatformHandler();
app.UseCors(builder =>
builder.WithOrigins("*").AllowAnyHeader().AllowAnyMethod());
//Middlewares addition to the pipelines:
///We add the middlewares in the following fashion:
///- Exception Handler
///- Logger
///- Authorization Handler
///There is a big reason of doing that.
///
app.UseExceptionHandler();
app.UseLoggerHandler();
app.UseAuthorizationHandler();
app.UseMvc();
}
Un AuthorizationController est comme suit:
[Route("api/Authorization")]
public class AuthorizationController : Controller
{
.
[HttpPost]
public void Post([FromBody]string value)
{
}
.
}
La Post
méthode avait à l'origine [FromBody]string[] value
. J'ai simplifié en faisant un simple string
type. Je suis en utilisant l'Avance de Repos Client sur Chrome pour envoyer un HTTP request
. Lorsque string[]
était le type I a été les valeurs suivantes dans le corps:
{
["value","sdjklgsdjlg"]
}
Après la simplification du paramètre, j'ai essayé d'envoyer la demande avec le corps suivantes:
{"sdjklgsdjlg"}
essayé ceci:
{"value":"sdjklgsdjlg"}
Suis-je raté quelque chose? Je l'ai lu avant, l'ancienne WebApi l'habitude de travailler en relation avec le JSON de la cartographie à la complexité des objets et des paramètres normaux, il fonctionne de manière similaire .NET de Base.
Aussi je doit préciser que point d'arrêt est frappé normalement sur tous les middlewares et les contrôleurs. Mais aucun des middleware semble être en mesure à la Demande de lecture du flux liés choses:
De bien vouloir me dire où je suis en train de problème. Merci beaucoup!
Que voulez-vous dire? Je suis en utilisant l'Avance de Repos Client. Il montre corriger les en-Têtes de Requête et de matières corps comme je l'ai mentionné ci-dessus.
avez-vous essayé sans [FromBody]? Je pense que cela fonctionnera sans que
J'ai essayé, essayé tout à l'heure à nouveau. Mais ne pensez-vous pas que si la valeur n'a pas à apparaître dans le contrôleur alors seulement ce
[FromBody]
pourrait avoir fait le problème. Mais ce n'est pas le cas. J'ai posté deux photos, qui sont de mon premier ExceptionMiddleware et vous pouvez voir quelles erreurs sont à apparaître dans le Corps et les variables de Formulaire de la demande.Vous ajoutez MVC deux fois, est-ce normal ? et MvcCore est ajouté deux fois trop. qui fait un peu bizarre
OriginalL'auteur FreshDev | 2016-03-18
Vous devez vous connecter pour publier un commentaire.
[FromBody]
utilise enregistré des formateurs pour décoder l'ensemble des données présentées dans le seul paramètre qu'il est appliqué par défaut, le seul inscrit formateur accepte de JSON.En JSON, il n'y a aucun moyen de représenter une chaîne de caractères directement
{"sdjklgsdjlg"}
n'est pas valide JSON,{"value":"sdjklgsdjlg"}
est, mais ne désérialiser à une simple chaîne de caractère en paramètre. EDIT: Voir la réponse par @tmg, cela peut être fait en utilisant la syntaxe{ "": "sdjklgsdjlg" }
Par conséquent, vous aurez besoin d'une sorte de modèle spécifique à la classe pour représenter l'entrée que vous essayez d'obtenir de l'organisme, par exemple:
Alors vous devriez être en mesure de réussir à faire:
Maintenant, si vous publiez
{ "Value": "some value" }
pour cela, il convient de faire ce que vous attendez.FromQuery
mais il ne fonctionne pas ici. Bien votre DTO astuce m'a permis d'obtenir les valeurs de la demande pour être mappé à ma méthode. Mais je ne suis pas encore capable de lire la Demande.Le corps et d'autres choses impliquant le contexte.Vous pouvez encore le faire à l'aide de [FromQuery] pour les paramètres de la requête, mais pas pour le corps de liaison - si vous demandez
api/Authorization?value=horse
ensuite utiliser[FromQuery]string value
il doit analyser correctement.merci pour cette @mark hughes, j'ai eu du mal avec ça pendant un moment, la grande explication
OriginalL'auteur Mark Hughes
Mark Hughes réponse est corrent jusqu'à un certain point. Si vous postez un json de ce format
{ "": "sdjklgsdjlg" }
modelbinder doit être capable de se lier à chaîne simple modèle, sans avoir besoin de l'emballage du modèle.Ooh, je ne savais pas que @tmg - intéressant!
Aucune idée de pourquoi je ne suis pas capable de lire la Demande.Corps?
OriginalL'auteur tmg
Cela fonctionne pour moi:
OriginalL'auteur bc3tech
Vous pouvez aussi faire quelque chose comme ceci:
ou de l'utilisateur
[FromQuery]
et de passer directement d'une valeur Querystring.Quel organisme avez-vous envoyé? De toute façon, je suggère humblement de vous pour vous simplifier la configuration: vous êtes en train d'ajouter MVC 4 fois de suite, je ne sais pas ce qu'il se passe quand tu fais ça plusieurs fois. Vous êtes également l'ajout de la Scro à deux reprises.
J'ai essayé différents corps. Mais ils ne peuvent faire aucun travail. Pas même les plus simples comme:
{"value":"someValue"}
je veux lire qu'en raw(octets) formulaire puis de le convertir en chaîne de caractères. Mais aucune des propriétés connecté à flux sont disponibles. Comme pour votre de dire que je suis ajoutant MVC plusieurs fois. Alors ce n'est pas le cas. Nous avons pour vous inscrire services dansConfigureServices
méthode, puisuse
dansConfigure
méthode. C'est exactement ce que je fais.Si vous ne voyez pas de contenu à tous, mon conseil pour vous est d'aller simple. Supprimer tout ce dont vous n'avez pas besoin, pas d'auth, pas de la scro. Aller simple et clair. Vous pouvez aussi tenter de créer une démo application avec visual studio modèle, puis vérifier les différences.
Je vais sûrement le faire. Mais ce n'est pas comme je ne peux pas voir tout le Contenu. La propriété: le contexte.Demande.ContentLength est réglé correctement(ce qui signifie qu'il a des valeurs différentes en fonction de la charge utile je suis d'envoi). Aussi mes valeurs dans la charge utile est mappé sur les variables du contrôleur. Mais je ne suis pas capable de lire la Demande de flux dans les middlewares.
OriginalL'auteur Luca Ghersi
Je suis en retard ici, mais que vous voulez partager la raison exacte de sorte que toute autre utilisateur peut obtenir des infos précises.
Vous n'êtes pas en mesure d'obtenir des valeurs au contrôleur parce que vous êtes la publication des données comme objet JSON:
Pour résoudre cela, nous avons besoin d'un autre objet à lier ces données. Quelque chose comme ceci à l'action de contrôleur:
ici CustomViewModel est une classe:
Si vous souhaitez obtenir des données comme par votre action en cours de signature:
Ensuite, vous avez besoin pour passer des données en tant que chaîne JSON dans le corps de la requête:
De même pour le tableau de chaîne d'action:
passer JSON tableau de chaîne de caractères dans le corps de la requête:
OriginalL'auteur Prateek Pandey
Vous devez utiliser la version RC2 de tous vos dépendances.
Il y a https://github.com/aspnet/KestrelHttpServer/issues/915 j'ai trouvé que la version de Système.Le filetage.Les tâches.Extensions est 4.0.0 par défaut. Donc, vous devez explicitement spécifier la version de ce package dans le projet.fichier json:
OriginalL'auteur Александр Алькевич