【问题标题】:Using JsonConverter on GET request in Web Api在 Web Api 中对 GET 请求使用 JsonConverter
【发布时间】:2014-11-18 20:19:57
【问题描述】:

我有一个带有 JsonConverter 属性的抽象类,如下所示:

[JsonConverter(typeof(SurveyItemConverter))]
public abstract class SurveyItem:ISurveyItem
{
    private class SurveyItemConverter : JsonCreationConverter<ISurveyItem>
    {
        protected override ISurveyItem Create(Type objectType, Newtonsoft.Json.Linq.JObject jObject)
        {
            var type = (SurveyItemType)jObject.Value<int>("Type");

            switch (type)
            {
                case SurveyItemType.Label:
                    return new SurveyLabel();
                case SurveyItemType.Textbox:
                    return new SurveyTextbox();
                case SurveyItemType.TextArea:
                    return new SurveyTextArea();
                case SurveyItemType.CheckBoxGroup:
                    return new SurveyCheckboxGroup();
                case SurveyItemType.Checkbox:
                    return new SurveyCheckbox();
                case SurveyItemType.RadioGroup:
                    return new SurveyRadioGroup();
                case SurveyItemType.RadioButton:
                    return new SurveyRadioButton();
                case SurveyItemType.Email:
                    return new SurveyEmail();
                case SurveyItemType.Telephone:
                    return new SurveyTelephone();
                case SurveyItemType.Number:
                    return new SurveyNumber();
                case SurveyItemType.DateTime:
                    return new SurveyDate();
                case SurveyItemType.Password:
                    return new SurveyPassword();
                case SurveyItemType.Url:
                    return new SurveyUrl();
                case SurveyItemType.ProfileName:
                    return new SurveyProfileName();
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }

    public string Label { get; set; }
    public int Id { get; set; }
    public SurveyItemType Type { get; set; }
}

如果请求是 POST/PUT,这可以正常工作,但对于 GET 请求,它会失败:

Cannot create an abstract class

处理get请求的控制器有一个带有签名的方法(该方法适用于不支持CORS的浏览器):

[HttpGet]
public async Task<IHttpActionResult> SubmitSurvey(HttpRequestMessage request, [FromUri] Survey survey)//survey contains a List<SurveyItem>

为什么不使用 JsonConverter?如何让 JsonConverter 使用此方法?

【问题讨论】:

    标签: c# asp.net-web-api json.net


    【解决方案1】:

    Web API 使用内容类型协商来确定要使用的反序列化程序。 GET 请求没有正文,因此没有内容类型。 Web API 不希望在 URL 中找到 JSON,因此在这种情况下它不使用 Json.Net,并且您的转换器不会被调用。显然最好的选择是使用 POST,但如果你必须让它与 GET 一起工作,你将需要:

    • 将数据作为标准查询字符串参数(不是 JSON)发送;
    • 从 URL 中获取 JSON 作为字符串并手动反序列化;或
    • 实现一个自定义绑定器,该绑定器知道要查找的内容并将其插入到 Web API 管道中

    这里是similar question,可能对前两个选项有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多