已解决如何使用包含土耳其字符的 HttpClient 进行查询

SOLVED How do I query with HttpClient containing Turkish characters

我正在使用 C# 开发 Web 服务。客户端工作正常,但如果参数包含土耳其字符,则结果为空。 我知道这是一个编码问题,但我不知道如何设置它。

我为 HttpClient 尝试了以下方法:

httpClient.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("windows-1254"));
httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("tr-TR"));

但是没用。我想也许如果我在参数中编码土耳其字符,反过来我已经尝试过:

HttpUtility.UrlEncode(district);
Uri.EscapeUriString(district);
Uri.EscapeDataString(district);

但是又不行了。我的代码块如下:

private HttpClient getClient() {
    HttpClient httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri(ConfigurationManager.AppSettings["ServiceBaseUrl"]);
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
    httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("windows-1254"));
    return httpClient;
}

public SupportPersonDto GetSupportPersonList(string city, string district) {
    SupportPersonDto serviceResult = null;
    string param = "<head>" +
                        "<user>" + ConfigurationManager.AppSettings["serviceUser"] + "</user>" +
                        "<pwd>" + ConfigurationManager.AppSettings["servicePass"] + "</pwd>" +
                        "<city>" + city + "</city>" +
                        "<district>" + district  + "</district>" +
                   "</head>";

    HttpClient httpClient = getClient();
    string apiUrl = "?xmlData=" + param;

    HttpResponseMessage response = httpClient.GetAsync(apiUrl).Result;
    if (response.IsSuccessStatusCode) {
        var stream = response.Content.ReadAsStreamAsync();
        stream.Wait();

        XmlRootAttribute xRoot = new XmlRootAttribute();
        xRoot.ElementName = "NGDIRECTORY";
        xRoot.IsNullable = true;
        XmlSerializer serializer = new XmlSerializer(typeof(SupportPersonDto), xRoot);
        serviceResult = (SupportPersonDto)serializer.Deserialize(stream.Result);
    }
    httpClient.Dispose();
    return serviceResult;
}

有人可以帮助我吗?

非常感谢所有提供帮助的人。 Daniel 和 Lasse 都建议我使用 UrlEncode,这是正确的答案。 问题已解决,如下编辑代码:

district = HttpUtility.UrlEncode(district, Encoding.GetEncoding("iso-8859-9"));

这么多天后:)

再次感谢您的帮助