我是.NET核心的新手。我正在尝试设置一个小的MVC应用程序。其中我实现了一个具有已定义路由的控制器。
[Route("api/ota")]
public class OTAController : ControllerBase
{
[HttpPost]
public async Task<ContentResult> EndPoint([FromBody] object otaHotelRatePlanNotifRQ)
{
Console.WriteLine("Something is posted");
...对于这个控制器,我实现了一个自定义的输入格式化程序,并在Startup.cs中注册了它。
services.AddMvc(options => {
options.InputFormatters.Insert(0, new RawRequestBodyInputFormatter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1)但是现在这个输入格式化程序适用于任何控制器和指定的路由。有没有办法只将格式化程序应用于指定的控制器/路由。
发布于 2020-06-25 16:16:27
添加您的输入格式化程序作为第一个格式化程序InputFormatters.Insert(0,new StringRawRequestBodyFormatter()),然后在此格式化程序中的CanRead方法中检查正在绑定的参数是否具有您在FromBody旁边指定的自定义属性
public override Boolean CanRead(InputFormatterContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
var contentType = context.HttpContext.Request.ContentType;
if (supportedMimes.Contains(contentType) &&
context.Metadata is DefaultModelMetadata mt &&
mt.Attributes.ParameterAttributes.Any(a=>a.GetType().Equals(typeof(RawJsonAttribute))))
return true;
else
return false;
}控制器操作:public IActionResult BeginExportToFile([RawJson,FromBody] string expSvcConfigJsonStr)
因此,简单地说,此格式化程序将仅用于受支持的mimes和具有自定义属性的参数。希望能有所帮助。
发布于 2019-03-01 20:28:49
是的,这可以通过在Startup.cs方法中添加一个新的路由来实现,默认情况下您需要为您想要的控制器添加一个新的路由:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});注意:顺序很重要。
https://stackoverflow.com/questions/51983012
复制相似问题