Я создаю приложение на C #, которое должно отправлять запросы HTTP GET с символом вертикальной линии внутри части запроса URI, что невозможно из-за кодирования URL-адреса классом URI. Таким образом, в последнем URL-адресе будет "% 7C" вместо "|" и серверное приложение не может справиться с этим.
Основная проблема заключается в том, что приложение на стороне сервера разработано нашим внешним поставщиком, и у меня нет доступа к его исходному коду, и они по какой-то причине не могут его редактировать, поэтому мне действительно нужно как-то сделать это в моем клиентском приложении.
Я много пробовал, но не могу найти никакого решения в интернете. Но у меня есть два обходных пути, которые могут сделать почти то, что я хочу:
1) Использование розеток
Это работает отлично, но ... когда я использую его асинхронно, серверное приложение не может обрабатывать больше сокетов одновременно и всегда запускаться только один раз, с одинаковым ответом на каждый запрос GET сокета. Клиентские сокеты имеют тот же хост (мой локальный ПК), но работают на другом порту локального ПК.
2) Использование элемента управления WebBrowser с методом Navigate
Даже это решение работает почти нормально, но я действительно не хочу использовать WebBrowser для каждого запроса GET.
Метод вызова GET через сокет
private static async Task<string> HttpGetRequestAsync(string url, int timeOut)
{
return await Task.Run(() =>
{
timeOut += Environment.TickCount;
Uri uri = new Uri(url);
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.Connect(uri.Host, uri.Port);
string request = string.Format(
"GET {0} HTTP/1.1{2}" +
"Host: {1}{2}" +
"Content-Length: 0{2}" +
"{2}", Uri.UnescapeDataString(uri.PathAndQuery), uri.Host, "\r\n");
socket.Send(Encoding.UTF8.GetBytes(request));
StringBuilder response = new StringBuilder();
byte[] responseData = new byte[BUFFER_SIZE];
int bytesRead = socket.Receive(responseData);
while (bytesRead != 0)
{
if (timeOut < Environment.TickCount) { throw new TimeoutException("TimeOut exception...!"); }
response.Append(Encoding.UTF8.GetChars(responseData), 0, bytesRead);
bytesRead = socket.Receive(responseData);
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
return response.ToString();
}
});
}
Так что мне действительно нужно найти способ, как отправить запрос GET в следующем формате:
http://server:port/sms/send_sms.php?value1|value2
вместо этого:
http://server:port/sms/send_sms.php?value1%7Cvalue2