I'd like to be able to consume either posted JSON or form data at the same URL.
As things stand, I get:
fail: Microsoft.AspNetCore.Mvc.Internal.ActionSelector[1]
Request matched multiple actions resulting in ambiguity. Matching actions:
:
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HLDLB0LJCPJ4", Request id "0HLDLB0LJCPJ4:00000001": An unhandled exception was thrown by the application.
Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:
https://andrewlock.net/model-binding-json-posts-in-asp-net-core/ suggests using different endpoints, but I can't do that in this case.
https://massivescale.com/web-api-routing-by-content-type/ suggests a way to do it for asp.net, for example:
[ContentTypeRoute("api/test/bytype", "application/json")]
or
[ContentTypeRoute("api/test/bytype", "application/x-www-form-urlencoded")]
but in .net core, we don't have System.Web.Http.Routing. Maybe it can be ported to use Microsoft.AspNetCore.Mvc.Routing... but is there something to replace IHttpRouteConstraint
My question: is something like this already built into .net core mvc?
For example, in Java's JAX-RS, there is @Consumes("application/json")
To enable attribute routing, call MapHttpAttributeRoutes during configuration. This extension method is defined in the System. Web. Http.
Web API 2 supports a new type of routing, called attribute routing. As the name implies, attribute routing uses attributes to define routes. Attribute routing gives you more control over the URIs in your web API.
The Route attribute can be applied on any controller or action method. In order to use attribute routing with Web API, it must be enabled in WebApiConfig by calling config. MapHttpAttributeRoutes() method.
With attribute-based routing, we can use C# attributes on our controller classes and on the methods internally in these classes. These attributes have metadata that tell ASP.NET Core when to call a specific controller. It is an alternative to convention-based routing.
I accomplished this by the Consumes attribute:
http://example.com/payment/callback - Accepts x-www-form-urlencoded.
[HttpPost]
[Route("callback")]
[Consumes("application/x-www-form-urlencoded")]
public ActionResult Post([FromForm] string value)
{
}
http://example.com/payment/callback - Same url but accepts application/json.
[HttpPost]
[Route("callback")]
[Consumes("application/json")]
public ActionResult Post([FromBody] JObject value)
{
}
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