HttpWebRequest.GetResponse()抛出“错误的请求” 400错误

问题描述:

以下是示例代码(改变实际的URL和凭证)HttpWebRequest.GetResponse()抛出“错误的请求” 400错误

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return true; }); 

var requestUri = new Uri("https://example.com/path1/path2?var=somevar"); 

byte[] data = Encoding.UTF8.GetBytes("DEV72*12/27/06*TAYLOR*RICH*JOE*10/28/56*U0999495102*466666666*01*TAYLOR*TAMMY*M*10/26/52***CIGNA HMO*62308*UPIN*MEDICAL CENTER**MESSAGE*M*F*30"); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri); 
request.PreAuthenticate = true; 
request.UseDefaultCredentials = false; 
request.Credentials = new NetworkCredential("UUUSSSEEERR", "PASSWORD"); 
request.ContentLength = data.Length; 
request.ContentType = "text/plain"; 
request.Method = "POST"; 

using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(data, 0, data.Length); 
    stream.Flush(); 
} 

StreamReader streamReader = null; 

string result; 
try 
{ 
    streamReader = new StreamReader(request.GetResponse().GetResponseStream()); 
    result = streamReader.ReadToEnd(); 
} 
finally 
{ 
    streamReader.Close(); 
} 

txtOutput.Text = result; 

它总是抛出第一次运行不好申请豁免,但是当我搬回了在调试器的光标到第一行它工作正常,并给出了正确的响应txtOutput.text和相同的行为,在分离的应用程序,第一次抛出异常,但第二次它工作正常,可以有人给我一些工作或让我知道什么我在这里做错了。 使用.net 4.0。

更新:

例如下面的代码为我工作,但这不是工作都是围绕我找的,我只是通过捕捉引发WebException,如果它的StatusCode添加一个while循环是400我RELOOP中的代码和它的工作原理

var requestUri = new Uri("https://example.com/path1/path2?var=somevar"); 

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return true; }); 

byte[] data = Encoding.UTF8.GetBytes("DEV72*12/27/06*TAYLOR*RICH*JOE*10/28/56*U0999495102*466666666*01*TAYLOR*TAMMY*M*10/26/52***CIGNA HMO*62308*UPIN*MEDICAL CENTER**MESSAGE*M*F*30"); 
HttpWebRequest request = null; 
int counter = 0; 
do 
{ 
    request = (HttpWebRequest)WebRequest.Create(requestUri); 

    request.PreAuthenticate = true; 
    request.UseDefaultCredentials = false; 
    request.Credentials = new NetworkCredential("USERNAME", "password"); 
    request.ContentLength = data.Length; 
    request.ContentType = "text/plain"; 
    request.Method = "POST"; 

    using (Stream stream = request.GetRequestStream()) 
    { 
     stream.Write(data, 0, data.Length); 
     stream.Flush(); 
    } 

    StreamReader streamReader = null; 

    string result = string.Empty; 
    try 
    { 
     streamReader = new StreamReader(request.GetResponse().GetResponseStream()); 
     result = streamReader.ReadToEnd(); 
    } 
    catch (WebException ex) 
    { 
     HttpWebResponse response = (HttpWebResponse)ex.Response; 
     if (response.StatusCode == HttpStatusCode.BadRequest) 
     { 
      counter++; 
     } 
     else 
     { 
      txtOutput.Text = ex.ToString(); 
     } 
    } 
    finally 
    { 
     if(streamReader != null) streamReader.Close(); 
    } 

    txtOutput.Text = result; 

} while (counter == 1); 

A stream.Close();后stream.Flush();可能会帮助