猿问

Web API 更改 JSON 解析器

我正在尝试更改我的 Web API 项目中的 JSON 解析器。


我遵循了以下教程:


https://docs.microsoft.com/en-us/aspnet/core/web-api/advanced/custom-formatters?view=aspnetcore-2.2


https://www.youtube.com/watch?v=tNzgXjqqIjI


https://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,那么什么都不会被解析。


我的问题是,我怎样才能让代码执行我的覆盖?


慕桂英3389331
浏览 107回答 2
2回答

qq_笑_17

更新格式化程序的注册方式public static class WebApiConfig {&nbsp; &nbsp; public static void Register(HttpConfiguration config) {&nbsp; &nbsp; &nbsp; &nbsp; // Other stuff...&nbsp; &nbsp; &nbsp; &nbsp; var jsonFormatter = new MyJsonFormatter();&nbsp; &nbsp; &nbsp; &nbsp; config.Formatters.Clear();&nbsp; &nbsp; &nbsp; &nbsp; config.Formatters.Insert(0, jsonFormatter);&nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; }}确保在启动或应用程序启动时遵循建议的语法。// configure Web ApiGlobalConfiguration.Configure(WebApiConfig.Register);还有下面文章中建议的内容协商过程在 ASP.NET Web API 中仅支持 JSON – 正确的方式使其适应您的示例,它看起来像public class JsonContentNegotiator : IContentNegotiator {&nbsp; &nbsp; MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse("application/json;charset=utf-8");&nbsp; &nbsp; private readonly MyJsonFormatter _jsonFormatter;&nbsp; &nbsp; public JsonContentNegotiator(MyJsonFormatter formatter) {&nbsp; &nbsp; &nbsp; &nbsp; _jsonFormatter = formatter;&nbsp; &nbsp; }&nbsp; &nbsp; public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) {&nbsp; &nbsp; &nbsp; &nbsp; var result = new ContentNegotiationResult(_jsonFormatter, mediaType);&nbsp; &nbsp; &nbsp; &nbsp; return result;&nbsp; &nbsp; }}并针对您的HttpConfigurationvar jsonFormatter = new MyJsonFormatter();config.Formatters.Clear();config.Formatters.Insert(0, jsonFormatter);//update content negotiationconfig.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));最后要注意的一条信息是该框架确实将其 JSON 格式与自己的格式紧密耦合JsonMediaTypeFormatter/// <summary>/// Gets the <see cref="MediaTypeFormatter"/> to use for Json./// </summary>public JsonMediaTypeFormatter JsonFormatter{&nbsp; &nbsp; get { return Items.OfType<JsonMediaTypeFormatter>().FirstOrDefault(); }}参考来源因此,取决于管道的多少实际上取决于 的实例的存在JsonMediaTypeFormatter,它可能会影响 JSON 相关的格式。如果这实际上是一个问题,那么我的建议是根据需要派生JsonMediaTypeFormatter并覆盖其成员。public class MyJsonFormatter : JsonMediaTypeFormatter {&nbsp; &nbsp; //... removed for brevity}但这可能会带来它自己的问题,具体取决于该基类与什么耦合。

慕田峪4524236

您需要在启动配置中注册格式化程序。
随时随地看视频慕课网APP
我要回答