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



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

我为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"));

这么多天后:)

再次感谢您的帮助

最新更新