Working on a new project using a WebAPI backend server and I am having trouble posting to the controller from an actual website, despite Postman having no issues posting to the controller. I get the an error 415, the browser console logging:

HTTP415: UNSUPPORTED MEDIA TYPE - The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method. (XHR)OPTIONS - http://localhost:5000/api/Users

Whilst the log from Kestrel is

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Request starting HTTP/1.1 OPTIONS http://localhost:5000/api/Users 0 Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 OPTIONS http://localhost:5000/api/Users 0 info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1] Executing HttpStatusCodeResult, setting HTTP status code 415 Microsoft.AspNetCore.Mvc.StatusCodeResult:Information: Executing HttpStatusCodeResult, setting HTTP status code 415 info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2] Executed action SchoolsChat.Controllers.UserContoller.Post (SchoolsChat) in 2.5323ms Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action SchoolsChat.Controllers.UserContoller.Post (SchoolsChat) in 2.5323ms info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] Request finished in 6.6615ms 415 Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 6.6615ms 415

I am trying to post the following JSON:

{ UserDOB: "2016-12-18", UserFirstName: "asdf", UserLastName: "asasdf", UserName: "asdf", UserSecret: "asdf" }

using this TypeScript class

/** * JsonPost */ class JsonPost { private _response: number; public get Reponse(): number { return this._response; } constructor(link: string, data: Object) { let request = new XMLHttpRequest(); request.withCredentials = true; request.open("POST", APIUri + link, true); request.setRequestHeader("content-type", "application/json"); request.setRequestHeader("cache-control", "no-cache"); request.onreadystatechange = () => this._response = request.status; console.log(request); request.send(JSON.stringify(data)); } }

The model of User is

public class User { [KeyAttribute] public int UserId { get; set; } [RequiredAttribute] public int SchoolId { get; set; } [RequiredAttribute] public string UserName { get; set; } [RequiredAttribute] [DataTypeAttribute(DataType.Password)] public string UserSecret { get; set; } // Unnecessary due to school linking? [RequiredAttribute] public virtual School UserSchool { get; set; } }

Whilst the controller for posting is simple, just outputting the first name

[HttpPost] public IActionResult Post([FromBody]User user) { Console.WriteLine(user.UserName); return StatusCode(200); }

Edit Whilst the answer from nemec was helpeful in resolving the problem, I found that for the WebAPI specifically the best resolution was to only configure cors using app.UseCors as services.AddCors in many cases didn't actually include the necessary headers in the response.