HTTPWebResponse Не удалось потоковую передачу ответа при передаче «Комбинация специальных символов» в качестве пароля в параметрах - PullRequest
0 голосов
/ 05 февраля 2019

Рабочий сценарий

При передаче первого параметра "strPostData" (не содержит специальных символов в пароле), как показано ниже, xml-запрос означает, что отлично работает, а StreamReader также предоставляет ответ и переменная "strResult" успешно загружена .. "Request = janajana "

НЕ рабочий сценарий

Но когда пароль пользователя содержит" специальные символы "в первом параметре," strPostData "означает, что StreamReader не смог предоставить ответ и переменная" strResult "не была успешно загружена.. "Request=<request><Username>jana</Username><Password>jana!@#$%^&*()</Password></request>" При передаче пароля с комбинацией "специальных символов" при сбое HTTPWebResponse и сбое Streamreader ..

Я пытался с оператором объекта Stream с ..

//string tempString = Encoding.UTF8.GetString(buffer, 0, buffer.Length); & 

Изменение кода буфера чтения // Int32 count = await streamRead.ReadAsync (readBuffer, 0, 256);но не работает ,,, пожалуйста, ведите меня кого-нибудь

public string[] GetResponseWebAPI(string strPostData, string strUrl)
{            
string[] arrReturn = new string[3];
HttpWebResponse myHttpWebResponse = null;
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] buffer = encoding.GetBytes(strPostData);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(strUrl);
myRequest.Timeout = 25000;// 25s
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = buffer.Length;
myRequest.AllowAutoRedirect = true;
ServicePointManager.ServerCertificateValidationCallback = new 
System.Net.Security.RemoteCertificateValidationCallback
(AcceptAllCertifications);
Stream newStream = myRequest.GetRequestStream();
newStream.Write(buffer, 0, buffer.Length);
newStream.Close();
myHttpWebResponse = (HttpWebResponse)myRequest.GetResponse();
WebHeaderCollection webHeader = myHttpWebResponse.Headers;
arrReturn[0] = webHeader["Statuscode"];
arrReturn[1] = webHeader["Statusmessage"];                
Stream streamResponse = myHttpWebResponse.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
Char[] readBuffer = new Char[256];
int count = streamRead.Read(readBuffer,0, 256);
string strResult = string.Empty;
while (count > 0)
{
strResult += new String(readBuffer,0, count);
count = streamRead.Read(readBuffer,0, 256);
}
arrReturn[2] = strResult;
streamRead.Close();
streamResponse.Close();
myHttpWebResponse.Close();           
return arrReturn;
}

1 Ответ

0 голосов
/ 05 февраля 2019

Я думаю, что проблема в

myRequest.ContentType = "application/x-www-form-urlencoded";

Итак, из этой строки вы говорите, что контент имеет URL-кодировку и должен экранироваться .Поэтому я полагаю, что в качестве быстрого решения вы могли бы изменить

byte[] buffer = encoding.GetBytes(strPostData);

на

byte[] buffer = encoding.GetBytes(WebUtility.UrlEncode(strPostData));

или что-то в этом роде.

Но я верю, что это намерение можно выразить лучше.Поэтому рассмотрите возможность использования HttpClient и FormUrlEncodedContent:

    public string[] GetResponseWebAPI(string strPostData, string strUrl)
    {
        string[] arrReturn = new string[3];

        ServicePointManager.ServerCertificateValidationCallback =
            (sender, certificate, chain, sslPolicyErrors) => true;
        var handler = new HttpClientHandler()
        {
            AllowAutoRedirect = false
        };
        using (var client = new HttpClient(handler))
        using (var content =
            new FormUrlEncodedContent(new[] {new KeyValuePair<string, string>("Request", strPostData)}))
        {
            client.Timeout = TimeSpan.FromSeconds(25);
            var response = client.PostAsync(strUrl, content).GetAwaiter().GetResult();

            arrReturn[0] = response.Headers.GetValues("Statuscode").FirstOrDefault();
            arrReturn[1] = response.Headers.GetValues("Statusmessage").FirstOrDefault();
            arrReturn[2] = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        }

        return arrReturn;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...