首页 / C# / c#-为同一端点使用任何类型的内容类型
c#-为同一端点使用任何类型的内容类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-为同一端点使用任何类型的内容类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2425字,纯文字阅读大概需要4分钟。
内容图文
我有一个asp.net core(v2.1)webapi项目,它公开了此功能:
[HttpPost]
[Route("v1/do-something")]
public async Task<IActionResult> PostDoSomething(ModelData model)
{
//...
}
和这个模型:
public class ModelData
{
[Required]
public string Email { get; set; }
}
从内容类型的角度来看,我想使此端点灵活.因此,可以在正文中发送此终结点不同的内容类型.
例如,将允许使用那些“ BODY”参数:
// application/x-www-form-urlencoded
email="abc123@gmail.com"
// application/json
{
"email": "abc123@gmail.com"
}
与旧的.net框架相反,在dotnet核心中不允许开箱即用.我发现我需要在[FormForm]属性中??添加Consume属性.但是,如果我在模型参数中添加[FormForm]属性,则它在JSON(例如)上将不再起作用-因为那时它应该是[FromBody].
我虽然可以使用如下代码:
[HttpPost]
[Route("v1/do-something")]
public async Task<IActionResult> PostDoSomething([FromBody] [FromForm] ModelData model)
{
//...
}
但是如您所料,此代码无法正常工作.
因此,为了获得这种灵活性,我必须复制所有端点-这听起来像是一个非常非常糟糕的主意.
[HttpPost]
[Route("v1/do-something")]
[Consume ("application/json")]
public async Task<IActionResult> PostDoSomething([FromBody] ModelData model)
{
//...
}
[HttpPost]
[Route("v1/do-something")]
[Consume ("application/x-www-form-urlencoded")]
public async Task<IActionResult> PostDoSomething([FromForm] ModelData model)
{
//...
}
// ... Other content types here ...
听起来很容易.但是似乎更复杂.
我错过了什么吗?如何使端点可以在任何内容类型中工作?
解决方法:
这是a custom model binder,将根据内容类型进行绑定.
public class BodyOrForm : IModelBinder
{
private readonly IModelBinderFactory factory;
public BodyOrForm(IModelBinderFactory factory) => this.factory = factory;
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
var contentType =
bindingContext.ActionContext.HttpContext.Request.ContentType;
BindingInfo bindingInfo = new BindingInfo();
if (contentType == "application/json")
{
bindingInfo.BindingSource = BindingSource.Body;
}
else if (contentType == "application/x-www-form-urlencoded")
{
bindingInfo.BindingSource = BindingSource.Form;
}
else
{
bindingContext.Result = ModelBindingResult.Failed();
}
var binder = factory.CreateBinder(new ModelBinderFactoryContext
{
Metadata = bindingContext.ModelMetadata,
BindingInfo = bindingInfo,
});
await binder.BindModelAsync(bindingContext);
}
}
经过以下操作测试.
[HttpPost]
[Route("api/body-or-form")]
public IActionResult PostDoSomething([ModelBinder(typeof(BodyOrForm))] ModelData model)
{
return new OkObjectResult(model);
}
内容总结
以上是互联网集市为您收集整理的c#-为同一端点使用任何类型的内容类型全部内容,希望文章能够帮你解决c#-为同一端点使用任何类型的内容类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。