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

但我知道这不是模型绑定器的意图。我在这里忽略了什么?

Web API - 基于 URL 段的反序列化正文 - 模型绑定程序或媒体格式化程序

所以我上面的解决方案有效,但我不建议这样做。

我正在寻找的行为(基于其他参数的条件参数绑定)不是框架原生的,虽然你可以将其破解到模型绑定器中,但有很多原因这是一个坏主意。

最好的选择是在控制器中只有单独的端点或逻辑