Dotnet Core 2.0.3迁移|编码无法翻译字节[8B]

时间:2017-12-04 02:30:47

标签: azure .net-core httpclient azure-web-app-service

我不确定这是否应该直接发送到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"));

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:1)

8B可以是多字节UTF8字符的第二个字节。 DecoderFallbackException告诉您将数据解释为其他编码。可能是拉丁语-1,doesn’t have 8B字符。

在fiddler中,您应该查看响应中的content-type HTTP标头。如果它显示application/jsonapplication/json; charset=utf-8,则可能是.NET中的错误,因为即使没有charset=utf-8 RFC 4627也说默认编码已经是UTF-8。

如果它说了别的话,我会尝试更改服务器,以便在响应中发送正确的内容类型标题。