This problem started off with IE9, where for POST
requests, the contentType
has to be text/plain
, and application/json
will not work.
I've added the moonscript and proceeded to use contentType: text/plain
. I've also added the custom media type to the api, as shown on numerous forms below:
And added the insertion of the text/plain
media type to the WebApiConfig
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
// allows 'text/plain' as a supported media type
config.Formatters.Add(new TextMediaTypeFormatter());
However, when posting in IE9 (using emulation), I am still receiving a 415 Unsupported Media Type
Key Value
Response HTTP/1.1 415 Unsupported Media Type
$.ajax({
type: "POST",
url: hope_forms.viivApiUrl + 'newsletter',
contentType: 'text/plain',
data: JSON.stringify(model),
success: function (data) {
.....
},
error: function (responseText) {
console.log(responseText)
modal.showModal('Something went wrong, please try again.');
}
});
Addition:
Here's the full blown WebApiConfig
in the event that something is out of order:
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
// To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
// For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
//config.EnableQuerySupport();
config.EnableSystemDiagnosticsTracing();
//config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
// allows 'text/plain' as a supported media type
config.Formatters.Add(new TextMediaTypeFormatter());
I also changed the ajaxTransport xhr
wrapper to use this instead:
https://github.com/gfdev/javascript-jquery-transport-xdr
Note:
As of today, 09/21, I've switched all my POST
requests to GET
, but I still would like a work-around to get these types back to POST
.
I think you've run into the strange XDomainRequest issue that cropped up in 2014 according to this MSDN blog
Note: As of 2014, XDomainRequest doesn’t appear to send any Content-Type header at all. It’s not clear to me when this changed.
Here's a previous SO question on the topic as well which actually references that blog.
This is also backed up by the documentation for the jQuery extension you are using. In the Readme.md
XDomainRequest have some limitations:
- there is no Content-Type header in request
So if you check HttpContext.Request.ContentType
I'm betting it's going to be null / empty in which case you should be able to assign the response type of "text/plain" and pray to the gods it works.
Basically IE < 10 support for XDomainRequest (and even XDomainRequest itself) is garbage. It has been basically ditched to my understanding and IE 10 implemented CORS support for XHR requests
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With