是否有一种方法可以仅为返回替换ASP.Net WebApi中的JSON格式化程序

本文关键字:Net ASP 替换 返回 WebApi 中的 程序 格式化 JSON 一种 方法 | 更新日期: 2023-09-27 18:27:55

我们发现,使用控制器上的属性,我们可以替换控制器默认的json格式化程序:-

public class WcsControllerConfigAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
    {
        var mediaType = ConfigurationManager.AppSettings["WcsMediaType"];
        if (mediaType == "application/json")
        {
            var formatter = controllerSettings.Formatters.OfType<JsonMediaTypeFormatter>().Single();
            controllerSettings.Formatters.Remove(formatter);
            formatter = new JsonMediaTypeFormatter
            {
                SerializerSettings =
                {
                    ContractResolver = new NullableValueContractResolver(), 
                    NullValueHandling = NullValueHandling.Include, 
                    DefaultValueHandling = DefaultValueHandling.Populate
                }
            };
            controllerSettings.Formatters.Add(formatter);
        }
    }
}

但这似乎不仅为我们希望返回的结果,而且为传入请求的json主体替换了格式化程序。有没有办法只替换响应的格式化程序而不替换请求?

编辑:好吧,作为医生的回应,我认为我应该说明我的最终目标是什么,因为这样也许你可以提供一个比使用格式化程序更好的解决方案。

我们正在与合作伙伴一起实现RESTful服务器。他们的系统(基于websphere)向我们发送完美的标准JSON,只是所有内容都用引号括起来。标准的格式化程序/解析器不会错过任何节拍,并愉快地将所有传入的引用值转换为日期、小数、布尔值等。我们不希望改变这种行为。

响应也是标准的JSON,但他们也希望引用所有值。因此,在我们的数据传输对象中,所有不是子对象或数组的东西都是字符串,并且在大多数情况下都能正确序列化。但另一个限制是,所有为空的属性都必须与大多数系统对待它们的方式不同。即:

  • 空字符串作为空字符串传递。"property":"而非"property":null
  • 空数组作为空数组传递。"array":[]而不是"array":null
  • 空的子对象作为空对象传递。"object":{}而非"object"(空)

我们也不允许简单地省略它们。我怀疑这并不容易。

我希望这能使要求更明确一点。我们使用格式化程序的解决方案基于另一个问题Json转换空字符串而不是null,这很好地发挥了作用,但只是因为它试图在两个方向上应用规则而出错。

是否有一种方法可以仅为返回替换ASP.Net WebApi中的JSON格式化程序

您可以编写一个自定义的MediaTypeFormatter来实现所需的功能。

关于如何编写自定义媒体类型格式化程序的官方教程可在此链接中获得http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

这样做将允许您使用JSON执行http请求,并返回与JSON不同的媒体类型。

请记住,在执行此操作时,客户端需要在请求中发送所需的媒体类型(在accept标头中)。

            ICredentials credentials = CredentialCache.DefaultCredentials;
            NetworkCredential credential = credentials.GetCredential(uri, "Basic");

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Credentials = credential;
            request.Method = "GET";
            request.Headers.Add("api-version", "1.0");
            request.Headers.Add("customer-code", code);
            request.Headers.Add("Authorization", AuthUser);
            request.ContentType = "application/json"; //The request is sent in JSON
            request.Accept = "text/plain"; //You ask the server to return the response in the format you need it
            HttpWebResponse response = (HttpWebResponse) request.GetResponse();
            Stream receiveStream = response.GetResponseStream();

是-您可以。。

您可以定义MediaTypeFormatter的两种不同实现。设置属性CanReadType()&CanWriteType()根据您的选择。然后实现WriteToStream()&两个格式化程序中的ReadFromStream()。最后为您的特定路线注册两个。