有没有办法在ASP.Net WebApi中替换返回的JSON格式化程序?

时间:2015-12-22 17:11:59

标签: c# asp.net json asp.net-web-api

我们发现在控制器上使用属性我们可以更换控制器默认的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,但他们也希望引用所有值。因此,在我们的数据传输对象中,不是子对象或数组的所有内容都是字符串,并且在大多数情况下都会正确序列化。但另一个限制是,所有null属性必须与大多数系统对待它们的方式区别对待。即:

  • 空字符串作为空字符串传递。 “property”:“”而不是“property”:null
  • 空数组作为空数组传递。 “array”:[]而不是“array”:null
  • 空子对象作为空对象传递。 “object”:{}而不是“object”:null

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

我希望这使得要求更加清晰。我们使用格式化程序的解决方案基于另一个问题Json Convert empty string instead of null,这很适合它的价值,但只是因为它试图在两个方向上应用规则而绊倒。

2 个答案:

答案 0 :(得分:1)

您可以编写自定义MediaTypeFormatter来实现您的需求。

此链接提供了有关如何编写自定义媒体类格式化程序的官方教程http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

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

请记住,当这样做时,客户端需要在请求上(在接受标头中)发送所需的媒体类型。

            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();

答案 1 :(得分:0)

是 - 你可以......

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