Web API - 基于 URL 段的反序列化正文 - 模型绑定程序或媒体格式化程序
本文关键字:程序 绑定 模型 媒体 格式化 正文 反序列化 基于 API URL Web | 更新日期: 2023-09-27 18:32:05
所以我一直在阅读 Web API 内容谈判,我有点困惑试图将其联系在一起以找到我面临的问题的解决方案。
我正在使用属性绑定,所以我的控制器方法如下所示:
[Route("{user}/{platform}/profile")]
[HttpPut]
public async Task UpdateProfile([ModelBinder]AppUser user, Platform platform, [FromBody] IProfile profile)
平台是一个枚举,列出了我们的各种产品平台(与软件/操作系统平台无关),例如 Alpha、Beta、Charlie。我们有相应的IProfile实现AlphaProfile,BetaProfile,CharlieProfile。
用户和平台参数反序列化只是查找和花花公子。但是,我无法找出让我的应用程序反序列化为正确对象的正确方法。目前我有一个像这样的IModelBinder实现:
public class ProfileModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
object platformParameterFromQueryString;
if (actionContext.RequestContext.RouteData.Values.TryGetValue("platform", out platformParameterFromQueryString))
{
Platform platformParameter;
if (platformParameterFromQueryString == null || !Enum.TryParse<Platform>(platformParameterFromQueryString.ToString(), out platformParameter))
throw new ArgumentException("platform parameter not found");
if (platformParameter== Platform.Alpha)
{
var jsonContent = actionContext.Request.Content.ReadAsStringAsync().Result;
bindingContext.Model = JsonConvert.DeserializeObject<AlphaProfile>(jsonContent);
}
else
{
throw new NotImplementedException();
}
}
return (bindingContext.Model != null);
}
}
但我知道这不是模型绑定器的意图。我在这里忽略了什么?
所以我上面的解决方案有效,但我不建议这样做。
我正在寻找的行为(基于其他参数的条件参数绑定)不是框架原生的,虽然你可以将其破解到模型绑定器中,但有很多原因这是一个坏主意。
最好的选择是在控制器中只有单独的端点或逻辑