无法将ISO-8859-1设置为web-api响应的字符集

时间:2015-03-24 12:24:29

标签: asp.net encoding iso-8859-1

我需要为我的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服务器对其进行了测试。

感谢。

2 个答案:

答案 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处理恼人的编码,但仅限于那些(希望是罕见的)情况