[英]WebAPI JsonConverter for x-www-form-urlencoded not working
I've created simple model with JsonConverter
attribute: 我用
JsonConverter
属性创建了简单的模型:
public class MyModel
{
[JsonProperty(PropertyName = "my_to")]
public string To { get; set; }
[JsonProperty(PropertyName = "my_from")]
public string From { get; set; }
[JsonProperty(PropertyName = "my_date")]
[JsonConverter(typeof(UnixDateConverter))]
public DateTime Date { get; set; }
}
and my converter: 和我的转换器:
public sealed class UnixDateConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (!CanConvert(reader.ValueType))
{
throw new JsonSerializationException();
}
return DateTimeOffset.FromUnixTimeSeconds((long)reader.Value).ToUniversalTime().LocalDateTime;
}
public override bool CanConvert(Type objectType)
{
return Type.GetTypeCode(objectType) == TypeCode.Int64;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var datetime = (DateTime) value;
var dateTimeOffset = new DateTimeOffset(datetime.ToUniversalTime());
var unixDateTime = dateTimeOffset.ToUnixTimeSeconds();
writer.WriteValue(unixDateTime);
}
}
When I send request from Postman and I set content type as application/json
everything works fine - my converter works fine, debugger stops at breakpoint in my converter, but I must use x-www-form-urlencoded
. 当我从Postman发送请求并将内容类型设置为
application/json
一切正常 - 我的转换器工作正常,调试器在我的转换器中的断点处停止,但我必须使用x-www-form-urlencoded
。
Is there an option to use JsonConverter
attribute inside model when sending data as x-www-form-urlencoded
? 在将数据作为
x-www-form-urlencoded
发送时,是否可以选择在模型中使用JsonConverter
属性?
I managed to do this by creating custom model binder that implements IModelBinder 我设法通过创建实现IModelBinder的自定义模型绑定器来实现此目的
Here is generic version of my binder: 这是我的活页夹的通用版本:
internal class GenericModelBinder<T> : IModelBinder where T : class, new()
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof (T))
{
return false;
}
var model = (T) bindingContext.Model ?? new T();
JObject @object = null;
var task = actionContext.Request.Content.ReadAsAsync<JObject>().ContinueWith(t => { @object = t.Result; });
task.Wait();
var jsonString = @object.ToString(Formatting.None);
JsonConvert.PopulateObject(jsonString, model);
bindingContext.Model = model;
return true;
}
}
And here is sample usage: 以下是示例用法:
[Route("save")]
[HttpPost]
public async Task<IHttpActionResult> Save([ModelBinder(typeof (GenericModelBinder<MyModel>))] MyModel model)
{
try
{
//do some stuff with model (validate it, etc)
await Task.CompletedTask;
DbContext.SaveResult(model.my_to, model.my_from, model.my_date);
return Content(HttpStatusCode.OK, "OK", new TextMediaTypeFormatter(), "text/plain");
}
catch (Exception e)
{
Debug.WriteLine(e);
Logger.Error(e, "Error saving to DB");
return InternalServerError();
}
}
I'm not sure if JsonProperty and JsonConverter attributes worked, but they should. 我不确定JsonProperty和JsonConverter属性是否有效,但他们应该这样做。
I'm aware that this might not be the best way to do it, but this code worked for me. 我知道这可能不是最好的方法,但这段代码对我有用。 Any suggestion are more than welcome.
任何建议都非常受欢迎。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.