MVC 可选正文参数



我正在尝试从第三方系统连接网络钩子。

创建订阅时,它会命中我提供的 URL,并需要返回经过验证的令牌来创建钩子。

当事件被触发时,钩子会发布到我在正文中提供数据的同一 URL。

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

两个 POST 方法之一(这会产生歧义异常(

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

或 complexObject 是可选的(如果不是,它会抛出一个正在执行的对象结果,在订阅创建步骤中写入类型为 '"Microsoft.AspNetCore.Mvc.SerializableError" 的值。

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

另一种解决方法:

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){}

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

最新更新