我需要为我的web api控制器的响应设置charset ISO-8859-1,而不是UTF-8。
用于测试的控制器返回一个POCO对象,如下所示:
public class StudyCaseController : ApiController
{
...
// GET: api/StudyCase/5
public Study Get(int id)
{
...
}
}
我尝试在Web.config中设置<globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/>
,但是使用这样的fiddler请求进行测试:
GET http://localhost:45988/api/StudyCase/1 HTTP/1.1
User-Agent: Fiddler
Host: localhost:45988
Accept: text/xml
我得到了这样的回复:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B? QzpcTUVESE9NRVxEZXNhcnJvbGxvQ1xQcm95ZWN0b3NcVmlld0NhcE1hblxWaWV3Q2FwTWFuXGFwaVxT dHVkeUNhc2VcMQ==?=
X-Powered-By: ASP.NET
Date: Tue, 24 Mar 2015 11:36:13 GMT
Content-Length: 1072
<?xml version="1.0"?>
... etc...
我还尝试使用Accept-Charset: iso-8859-1
在请求中指定字符集,但结果相同。
有关详细信息,我已使用IIS Express和IIS服务器对其进行了测试。
感谢。
答案 0 :(得分:0)
您可以在HttpConfiguration
课程中为格式化程序设置支持的编码。 28591是ISO-8859-1(拉丁文1)的代码页。
config.Formatters.Add(new XmlMediaTypeFormatter());
config.Formatters[0].SupportedEncodings.Clear();
config.Formatters[0].SupportedEncodings.Add(Encoding.GetEncoding(28591));
答案 1 :(得分:0)
处理我自己的问题,我发现问题确实是XML MediaTypeFormatter。
它不支持ISO-8859-1,如果没有更改服务器端代码的能力,我被迫使用另一个MediaTypeFormatter
https://www.nuget.org/packages/NetBike.Xml.Formatting/
或在nuget console中
Install-Package NetBike.Xml.Formatting
这解决了我的问题(在使用Web API 2的项目中)。 以下是使用HttpClient设置此方法的一种方法的演示
private static HttpClient httpClient;
private static MediaTypeFormatter formatter;
private static List<MediaTypeFormatter> formatters;
public static void loadSettings()
{
//httpClient settings are set here
formatters = new List<MediaTypeFormatter>();
formatter = new NetBike.Xml.Formatting.NetBikeXmlMediaTypeFormatter();
formatters.Add(formatter);
}
public static async Task<HttpResponseMessage> GetContent(string requestMethod)
{
try
{
var returnValue = await httpClient.GetAsync(requestMethod);
return returnValue;
}
catch (Exception ex)
{
Debug.WriteLine("Communicator.GetXml: " + ex.Message);
}
return null;
}
public static async void testStuff()
{
var httpResponse = await GetContent("http://someDomain.com/someMethod");
MyModelObject myModel = await httpResponse.Content.ReadAsAsync<MyModelObject>(formatters);
}
您要做的是将其设置为整个项目的默认格式化程序。
- 编辑 -
Microsoft认为此行为是有意的。 https://connect.microsoft.com/VisualStudio/feedback/details/958121
在格式化高级XML对象时,我遇到过NetBike格式化程序的问题,甚至有将BOM写入输出的情况。
因此我不推荐它在默认的MediaTypeSerializer之上,而是解决方案回归旧的“它取决于”
在代码
中看起来像这样 List<MediaTypeFormatter> formatters = new List<MediaTypeFormatter>();
MediaTypeFormatter badencodingFormatter = new NetBike.Xml.Formatting.NetBikeXmlMediaTypeFormatter();
badencodingFormatter.SupportedEncodings.Clear();
badencodingFormatter.SupportedEncodings.Add(Encoding.GetEncoding("ISO-8859-1"));
MediaTypeFormatter defaultFormatter = new CustomXmlMediaTypeFormatter();
formatters.Add(badencodingFormatter);
formatters.Add(defaultFormatter);
这可以确保NetBike处理恼人的编码,但仅限于那些(希望是罕见的)情况