我们发现在控制器上使用属性我们可以更换控制器默认的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属性必须与大多数系统对待它们的方式区别对待。即:
我们也不允许简单地省略它们。并不是说我怀疑这很容易。
我希望这使得要求更加清晰。我们使用格式化程序的解决方案基于另一个问题Json Convert empty string instead of null,这很适合它的价值,但只是因为它试图在两个方向上应用规则而绊倒。
答案 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()。最后根据您的具体路线注册它们。