簡體   English   中英

HTTPWebResponse在參數中傳遞“特殊字符組合”作為密碼時,無法流式傳輸響應

[英]HTTPWebResponse Failed to stream the response when passing “Combination Of Special characters” as password in Parameters

工作場景

當按如下方式傳遞第一個參數“ 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 =等待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;
}

我認為問題出在

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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM