Я работаю над веб-приложением 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 + символы, такие как &
, +
????