2017-05-22 4 views
0

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(); 
} 
+0

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? –

+0

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. –

+0

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. –

Antwort

0

Es sieht aus wie Sie Ihre Methode mit dem [EnableCors] Attribut schmücken müssen wie hier dokumentiert

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api

Anfragen von Postboten tun benötigen keine CORS wie clientseitige Browser-Anfragen.

+0

I verwendet var corsConfig = new EnableCorsAttribute ("*", "Content-Type", "GET, POST, PUT PATCH, DELETE OPTIONS"); config.EnableCors (corsConfig); in der Start-Config-Klasse und entfernt die CORS Zeug aus der web.config. Es schien das web.config-Zeugs zu sein, das das Problem verursacht hat. – user1806676