繁体   English   中英

WebApi 2 Odata控制器编码

[英]WebApi 2 Odata Controller encoding

如何调整WebApi2 Odata Controller,以与ApiController相同的方式序列化数据? 为什么将非Unicode字符从“č”替换为“ \\ u010d”?

例如

 public class PacientaiController : ODataController
    { ...
     // GET: odata/Pacientai
        [Queryable(MaxExpansionDepth = 8)]
        public  IHttpActionResult GetPacientai(ODataQueryOptions<Pacientas> queryOptions)
        {

结果是

{
    "odata.metadata": "http://localhost:13248/odata/$metadata#Pacientai",
    "value": [{
        "Id": 1147146,
        "Vardas": "Edgaras",
        "Pavarde": "Me\u010dkauskas",
        "AK": "12341412341",
        "GimimoData": "1986-01-16T00:00:00"
    }]
}

如果我像这样将控制器更改为ApiController

 public class PacientaiController : ApiController
    { ...
        [Queryable(MaxExpansionDepth = 8)]
        public  IHttpActionResult GetPacientai()
        {

结果是这样的:

{
    "Id": 1147146,
    "Vardas": "Edgaras",
    "Pavarde": "Mečkauskas",
    "AK": "12341412341",
    "GimimoData": "1986-01-16T00:00:00",
}

注意字段:Pavarde!

我们可以编写一个消息处理程序:

public class StringRewriter : DelegatingHandler
{
    private static readonly JsonMediaTypeFormatter formatter;

    static StringRewriter()
    {
        formatter = new JsonMediaTypeFormatter();
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        var response = await base.SendAsync(request, cancellationToken);
        if (response.Content == null || response.Content.Headers.ContentType == null ||
            response.Content.Headers.ContentType.MediaType != "application/json")
        {
            return response;
        }

        var stream = await response.Content.ReadAsStreamAsync();
        var token = JToken.ReadFrom(new JsonTextReader(new StreamReader(stream)));

        var content = new ObjectContent<JToken>(token, formatter);
        foreach (var header in response.Content.Headers)
        {
            content.Headers.TryAddWithoutValidation(header.Key, header.Value);
        }

        response.Content = content;

        return response;
    }
}

并将其添加到WebApiConfig中:

    public static void Register(HttpConfiguration config)
    {
        config.MessageHandlers.Add(new StringRewriter());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM