已解决如何使用包含土耳其字符的 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"));
这么多天后:)
再次感谢您的帮助
我正在使用 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"));
这么多天后:)
再次感谢您的帮助