Ich habe ein Problem, bei dem POST-Inhalt nicht wie erwartet in der Web-API funktioniert.ASP.NET-Web-API kann nicht vom POST-Nachrichtentext lesen
die Tutorials Im Anschluss an, ich sollte in einem Controller Routen zu müssen in der Lage sein, die wie folgt (1 Form) aussehen:
[Route("my-post-method")]
public HttpResponseMessage MyPostMethod(MyModel model)
{
Request.CreateResponse(HttpStatus.OK, model.SomeNumber * 5);
}
Aber das funktioniert nicht. Stattdessen muss ich die folgende (Form 2) tun:
[Route("my-post-method")]
public HttpResponseMessage MyPostMethod()
{
var text = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
var model = JsonConvert.DeserializeObject<MyModel>(text);
Request.CreateResponse(HttpStatusCode.OK, model.SomeNumber * 5);
}
Nun Ich denke, das hat etwas mit dem CORS-Setup auf dem Projekt zu tun, aber ich bin nicht sicher. Wenn ich versuche, über Postman die Anfrage zum Formular 1 zu stellen, funktioniert alles wie vorgesehen. Wenn ich versuche, über den Browser eine Anfrage auf Formular 1 zu stellen, und ich den Inhaltstyp-Header nicht setze, bekomme ich einen nicht unterstützten Medientypfehler bei der POST-Anfrage (das ist, was ich erwarte), aber wenn ich das setze Content-Type header zu "application/json", dann gibt die Web API eine 404 Antwort auf die OPTIONS Preflight Anfrage zurück. Außerdem fügt das Hinzufügen eines [FromBody] -Attributs zum Methodenargument nichts hinzu.
Die Web.config enthält:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
und die Startup-Konfigurationsklasse:
public static void Register(HttpConfiguration config)
{
config.EnableCors();
config.MapHttpAttributeRoutes();
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
jsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
config.EnsureInitialized();
}
Fügen Sie nicht die [FromBody] hinzu (https://stackoverflow.com/questions/24625303/why-do-we-have-to-specify-frombody-and-froruri-in-asp-net-web -api) Attribut? –
Sie erwähnten * forms * und sprachen dann über * Json *. Was versuchst du zu machen? Zeigen Sie uns auch, wie Sie versuchen, dieses Modell über den Browser zu veröffentlichen. –
Auch ** ** ** ** aktivieren Sie CORS zweimal in der gleichen Anwendung für [diesen Grund] (https://stackoverflow.com/a/36968863/3670737). Aktivieren Sie es in Web Api ** OR ** innerhalb 'Web.config', nicht beides. –