MVC可选主体参数

时间:2018-10-17 20:54:10

标签: asp.net-mvc asp.net-core

我正在尝试从第三方系统连接一个Webhook。

创建订阅时,它会到达我提供的URL,并且需要返回经过验证的令牌才能创建钩子。

触发事件时,钩子将发布到与正文中提供的数据相同的URL。

如何获取Core 2.1 MVC控制器/路由,以将其视为控制器上的两个不同方法或复杂对象为可选的方法签名?

两种POST方法(这会产生歧义异常)

public async Task<IActionResult> Index(){}
public async Task<IActionResult> Index([FromBody] ComplexObject co){}

或complexObject是可选的(如果不是,则抛出Executing ObjectResult,在预订创建步骤中写入类型为““ Microsoft.AspNetCore.Mvc.SerializableError”的值。)

public async Task<IActionResult> Index([FromBody] ComplexObject co){}

2 个答案:

答案 0 :(得分:0)

我使用了空参数方法签名并检查了正文是否有数据。不理想。

答案 1 :(得分:0)

另一种解决方法:

public class AllowBindToNullAttribute : ModelBinderAttribute
{
    public AllowBindToNullAttribute()
        : base(typeof(AllowBindToNullBinder))
    {

    }

    public class AllowBindToNullBinder : IModelBinder
    {
        public async Task BindModelAsync(ModelBindingContext bindingContext)
        {
            var stream = bindingContext.HttpContext.Request.Body;
            string body;
            using (var reader = new StreamReader(stream))
            {
                body = await reader.ReadToEndAsync();
            }

            var instance = JsonConvert.DeserializeObject(body, bindingContext.ModelType);
            bindingContext.Result = ModelBindingResult.Success(instance);
        }
    }
}

您将像这样使用它:

public async Task<IActionResult> Index(
    [FromBody] [AllowBindToNull] ComplexObject co = null){}