2017-09-14 1 views
2

Meine Hände sind in der Luft - ich weine, Onkel. Helfen Sie mir zu verstehen:ASP.Net httpwebrequest nicht Buchungsanfrage Körper

Ich schrieb eine einfache HttpWebRequest Buchung an einen Kunden https://website. Es hat spezifische Header-Anforderungen und einen JSON-Anfragetext. Der GetResponseStream ist nach dem Empfang einer GetResponse StatusCode.OK ein Fehler, der von ihrem Server bereitgestellt wird. Sie überprüften ihre Protokolle und sagte, während die Header vorhanden waren, die Anfrage Body „war

Hier ist mein Code:.

public const string API_URILogin = "https://dev.clientURL.com/test/api/login"; 
    private void RequestTest() 
    { 
     LoginAPIStruct loginInfo = new LoginAPIStruct(); 

     loginInfo.loginId = TestId; 
     loginInfo.password = TestPw; 
     loginInfo.vehicleType = "E"; 
     loginInfo.deviceId = "ABCDEF"; 
     loginInfo.clientId = "123456"; 
     loginInfo.appVersion = string.Empty; 
     loginInfo.osType = string.Empty; 
     loginInfo.osVersion = string.Empty; 

     // Call LoginAPI 
     string loginStatus = LoginAPI(loginInfo); 
     //Display Results 
     lblResults.Text = loginStatus; 
    } 


    // Public Variables 
    public static string errorMessage; 

    // ** Client Login ** 
    public static string LoginAPI(LoginAPIStruct loginInfo) 
    { 
     // Post Login to Client. Get response with Vehicle structure. 
     string loginInfoSerialized = string.Empty; 
     string returnString = string.Empty; 

     loginInfoSerialized = new JavaScriptSerializer().Serialize(loginInfo); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(API_URILogin); 
     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     request.Headers.Add("From", "CC"); 
     request.Headers.Add("Language", "0"); 
     request.Headers.Add("Offset", "-8"); 
     request.Headers.Add("To", "CCM"); 

     // Post Request 
     using (StreamWriter streamPost = new StreamWriter(request.GetRequestStream())) 
     { 
      streamPost.Write(loginInfoSerialized); 
     } 

     // Get Response 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      // Status Okay. 
      //string responseStatusDescription = response.StatusDescription; 

      using (var streamReader = new StreamReader(response.GetResponseStream())) 
      { 
       try 
       { 
        var result = streamReader.ReadToEnd(); 

        returnString = result; 
       } 
       catch (Exception ex) 
       { 
        returnString = ex.Message; 
       } 

      } 
     } 
     else 
     { 
      returnString = response.StatusCode.ToString(); 
     } 

     return returnString; 
    } // end LoginAPI 

Meine JSON-String scheint gültig zu sein - ich fügen Sie ihn in Fiedler, zusammen mit die Header setzen, und Fiddler gibt eine erfolgreiche Anmeldung zurück

Von ASP.Net gibt es ihren dokumentierten Fehler, dass die E-Mail-Adresse (LoginId) erforderlich ist. Ich sehe nichts falsch in meinem C# -Code Sonst könnte der Client etwas auf seiner Hosting-Site haben, das eine bestimmte Anfrage blockiert oder herausfiltert? Ich stecke fest.

+0

Update: Ich habe festgestellt, wie ASP.net konfiguriert wird, damit Fiddler als Proxy fungiert. GlobalProxySelection.Select = new WebProxy ("127.0.0.1", 8888); Ich sehe meine Header, aber die Content-Länge ist auf 0 gesetzt und kein Inhalt wird gesendet. WARUM? – IrvineCAGuy

Antwort

0

Also, für jeden, der es wissen will .... müssen Sie den StreamWriter nach dem Ausführen des .Write (Nutzlast) -Befehls "schließen", sonst sendet er die Daten nicht wirklich.

// Post Request 
     StreamWriter streamPost = new StreamWriter(request.GetRequestStream()); 
     streamPost.Write(loginInfoSerialized); 
     streamPost.Close(); //Don't forget to Close() or no data sent!! 

Ich hoffe, das jemand anderes hilft, wie ich 2 Wochen Kampf gegen diese Unterlassung verbringen. Ciao.

+0

Anstatt Stream manuell zu schließen, verwenden Sie 'using' Anweisung, da StreamWriter die IDisposable Schnittstelle implementiert, die den Stream automatisch disponiert, sobald Ihr Programm die' using' Anweisung verlässt –

Verwandte Themen