Я работаю над веб-приложением asp.net mvc 4. и я использую .net 4.5. теперь у меня есть следующий класс WebClient():
using (var client = new WebClient())
{
var query = HttpUtility.ParseQueryString(string.Empty);
query["model"] = Model;
//code goes here for other parameters....
string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"];
var url = new UriBuilder(apiurl);
url.Query = query.ToString();
string xml = client.DownloadString(url.ToString());
XmlDocument doc = new XmlDocument();
//code goes here ....
}
теперь я заметил проблему, когда один из параметров содержит фрахтователей не ASCII, таких как £, ¬ и т.д.
теперь окончательный запрос будет иметь любые не-ASCII символы (например, £), закодированные неправильно (как %u00a3). я читал об этой проблеме и, кажется, могу заменить: -
url.Query = query.ToString();
с
url.Query = ri.EscapeUriString(HttpUtility.UrlDecode(query.ToString()));
теперь с использованием более позднего подхода будет кодировать £ как %C2%A3, который является правильным кодированным значением.
но проблема я сталкивается с url.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString()));, в этом случае один из параметров содержит &, тогда url будет иметь следующий формат &operation=AddAsset&assetName=&...., поэтому он будет считать, что я пропускаю пустой параметр propertyName not value = &??
ИЗМЕНИТЬ
Позвольте мне снова подвести итог моей проблеме. Я хочу иметь возможность передавать следующие 3 вещи внутри моего URL-адреса в API третьей части:
-
Стандартные символы, такие как A, B, a, b, 1, 2, 3...
-
Не-ASCII-символы, такие как
£,¬. -
а также специальные символы, которые используются в кодировке url, например
&,+.
теперь я попробовал следующие 2 подхода:
Подход A:
using (var client = new WebClient())
{
var query = HttpUtility.ParseQueryString(string.Empty);
query["model"] = Model;
//code goes here for other parameters....
string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"];
var url = new UriBuilder(apiurl);
url.Query = query.ToString();
string xml = client.DownloadString(url.ToString());
XmlDocument doc = new XmlDocument();
//code goes here ....
}
В этом подходе я могу передавать такие значения, как &, +, поскольку они будут кодироваться по URL-адресу, но если я хочу передать не-ASCII-символы, они будут закодированы с использованием ISO-8859-1... поэтому, если у меня есть значение £, мой код будет закодирован как %u00a3, и он будет сохранен внутри стороннего API как %u00a3 вместо £.
Подход B:
Я использую:
url.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString()));
вместо
url.Query = query.ToString();
теперь я могу передавать не-ASCII-символы, такие как £, поскольку они будут правильно закодированы с использованием UTF8 вместо ISO-8859-1. но я не могу передавать такие значения, как &, потому что мой url будет неправильно прочитан сторонним API. Например, если я хочу передать assetName=&, мой url будет выглядеть следующим образом:
&operation=Add&assetName=&
поэтому API-интерфейс третьей части будет считать, что я пропускаю пустой assetName, в то время как я пытаюсь передать его значение как &...
поэтому не уверен, как я могу передать оба символа без символов ASCII + символы, такие как &, +????