Как поместить вертикальную линию в запрос HTTP GET без кодировки URI - PullRequest
0 голосов
/ 11 апреля 2019

Я создаю приложение на 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

...