我不确定这是否应该直接发送到github,但我认为如果有人之前遇到过此问题,请先在此处查看。
我最近升级了我的一个应用程序,使用点网2.0.3从1.1.4开始。
一切都在本地工作正常,但当我在azure中部署到我的应用服务时,我得到以下异常。
System.Text.DecoderFallbackException: Unable to translate bytes [8B] at index 1 from specified code page to Unicode.
调用它的代码是一个在应用程序之间进行通信的httpclient。
public async Task<T1> Get<T1>(string url, Dictionary<string, string> urlParameters = null) where T1 : DefaultResponse, new()
{
var authToken = _contextAccessor.HttpContext.Request.Cookies["authToken"];
using (var client = new HttpClient().AcceptJson().Acceptgzip().AddAuthToken(authToken))
{
var apiResponse = await client.GetAsync(CreateRequest(url, urlParameters));
T1 output;
if (apiResponse.IsSuccessStatusCode)
{
output = await apiResponse.Content.ReadAsAsync<T1>();
//output.Succeeded = true;
}
else
{
output = new T1();
var errorData = GlobalNonSuccessResponseHandler.Handle(apiResponse);
output.Succeeded = false;
output.Messages.Add(errorData);
}
return output;
}
}
public static HttpClient AcceptJson(this HttpClient client)
{
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return client;
}
public static HttpClient Acceptgzip(this HttpClient client)
{
// Commenting this out fixes the issue.
//client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("gzip"));
client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("deflate"));
return client;
}
public static HttpClient AddAuthToken(this HttpClient client, string authToken)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
return client;
}
我对有什么事情感到有点难过。
所以我有2个应用程序,从现在起我们称之为客户端和服务器。
客户端使用上述代码与服务器通信。
在本地,这对天蓝色不太好,在升级之前一切正常。
所以我在本地设置客户端以便在azure上与服务器通信我能够复制问题。
我看了一下fiddler中的响应,它能够正确解码它。
如果有人知道我应该在哪里看,并且在任何信息变得很棒之前已经看过它:D。
更新1
因此,在进行了一些挖掘之后,我决定删除gzip,然后一切都开始工作了。
client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("gzip"));
任何人都能解释一下吗?
答案 0 :(得分:1)
8B可以是多字节UTF8字符的第二个字节。 DecoderFallbackException告诉您将数据解释为其他编码。可能是拉丁语-1,doesn’t have 8B字符。
在fiddler中,您应该查看响应中的content-type
HTTP标头。如果它显示application/json
或application/json; charset=utf-8
,则可能是.NET中的错误,因为即使没有charset=utf-8
RFC 4627也说默认编码已经是UTF-8。
如果它说了别的话,我会尝试更改服务器,以便在响应中发送正确的内容类型标题。