为了账号安全,请及时绑定邮箱和手机立即绑定

Web API 更改 JSON 解析器

Web API 更改 JSON 解析器

C#
慕桂英3389331 2022-07-23 16:37:44
我正在尝试更改我的 Web API 项目中的 JSON 解析器。我遵循了以下教程:https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/custom-formatters?view=aspnetcore-2.2https://www.youtube.com/watch?v=tNzgXjqqIjIhttps://weblog.west-wind.com/posts/2012/Mar/09/Using-an-alternate-JSON-Serializer-in-ASPNET-Web-API我现在有以下代码:public class MyJsonFormatter : MediaTypeFormatter    {        public MyJsonFormatter()        {            base.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));        }        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)        {            return null;        }        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)        {            return null;        }        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)        {            base.SetDefaultContentHeaders(type, headers, mediaType);        }        public override bool CanReadType(Type type)        {            return true;        }        public override bool CanWriteType(Type type)        {            return true;        }        public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)        {            return base.GetPerRequestFormatterInstance(type, request, mediaType);        }        public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)        {            return null;        }我的问题是,无论我做什么,JSON 都会被解析,它似乎忽略了我的代码——我可以在读取或写入方法中抛出异常,但什么都不会发生,断点不会被命中等。我知道这个格式化程序正在被添加,因为只有我的类中的内容类型是可见的,如果我设置CanReadType为返回 false,那么什么都不会被解析。我的问题是,我怎样才能让代码执行我的覆盖?
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

更新格式化程序的注册方式


public static class WebApiConfig {


    public static void Register(HttpConfiguration config) {


        // Other stuff...


        var jsonFormatter = new MyJsonFormatter();

        config.Formatters.Clear();

        config.Formatters.Insert(0, jsonFormatter);


        //...

    }

}

确保在启动或应用程序启动时遵循建议的语法。


// configure Web Api

GlobalConfiguration.Configure(WebApiConfig.Register);

还有下面文章中建议的内容协商过程


在 ASP.NET Web API 中仅支持 JSON – 正确的方式


使其适应您的示例,它看起来像


public class JsonContentNegotiator : IContentNegotiator {

    MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse("application/json;charset=utf-8");

    private readonly MyJsonFormatter _jsonFormatter;


    public JsonContentNegotiator(MyJsonFormatter formatter) {

        _jsonFormatter = formatter;

    }


    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) {

        var result = new ContentNegotiationResult(_jsonFormatter, mediaType);

        return result;

    }

}

并针对您的HttpConfiguration


var jsonFormatter = new MyJsonFormatter();


config.Formatters.Clear();

config.Formatters.Insert(0, jsonFormatter);


//update content negotiation

config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

最后要注意的一条信息是该框架确实将其 JSON 格式与自己的格式紧密耦合JsonMediaTypeFormatter


/// <summary>

/// Gets the <see cref="MediaTypeFormatter"/> to use for Json.

/// </summary>

public JsonMediaTypeFormatter JsonFormatter

{

    get { return Items.OfType<JsonMediaTypeFormatter>().FirstOrDefault(); }

}

参考来源


因此,取决于管道的多少实际上取决于 的实例的存在JsonMediaTypeFormatter,它可能会影响 JSON 相关的格式。


如果这实际上是一个问题,那么我的建议是根据需要派生JsonMediaTypeFormatter并覆盖其成员。


public class MyJsonFormatter : JsonMediaTypeFormatter {


    //... removed for brevity


}

但这可能会带来它自己的问题,具体取决于该基类与什么耦合。


查看完整回答
反对 回复 2022-07-23
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

您需要在启动配置中注册格式化程序。



查看完整回答
反对 回复 2022-07-23
  • 2 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号