2017-02-20 6 views
1

ich einen JSON-API in C# Methoden sind zu übersetzen, und ich stieß auf ein Problem, wo der JSON-RPC API (POST) sagtC# HttpWebRequest "Request-Header" in JSON POST

Alle andere Methoden das Ergebnis von Authentifizierung erfordern (= sessionId) entweder pro pathparameter

;jsessionid=644AFBF2C1B592B68C6B04938BD26965

oder pro Cookie (Request)

JSESSIONID=644AFBF2C1B592B68C6B04938BD26965

Meine aktuelle WebRequest Methode:

private async static Task<string> SendJsonAndWait(string json, string url, string sessionId) { 
     string result; 

     HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "POST"; 

     using(StreamWriter streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync())) { 
      await streamWriter.WriteAsync(json); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 

     HttpWebResponse httpResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync(); 
     Stream responseStream = httpResponse.GetResponseStream(); 
     if(responseStream == null) 
      throw new Exception("Response Stream was null!"); 

     using(StreamReader streamReader = new StreamReader(responseStream)) { 
      result = await streamReader.ReadToEndAsync(); 
     } 

     return result; 
    } 

Wie füge ich die JSESSIONID Parameter zu meinem WebRequest? WebRequests kenne ich nicht, bitte kurz erklären!

Vielen Dank!

+1

Haben Sie versucht, direkt zu Ihrer URL hinzuzufügen? –

+0

Wie @RomEh vorgeschlagen, können Sie den Parameter der URL als Abfragezeichenfolgeparameter hinzufügen, oder Sie können ein Wörterbuchobjekt mit den Schlüsseln 'sessionid' und' json' zusammen mit ihren Werten erstellen, es als JSON-Zeichenfolge serialisieren und dann Fügen Sie es dem Anforderungsstream hinzu. –

Antwort

1

Verwendung Cookies.

Ihr Fall würde so aussehen;

private async static Task<string> SendJsonAndWait(string json, string url, string sessionId) { 
    Uri uri = new Uri(url); 
    string result; 

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "application/json"; 
    httpWebRequest.Method = "POST"; 

    //Add the JSESSIONID Cookie 
    if(httpWebRequest.CookieContainer == null) 
      httpWebRequest.CookieContainer = new CookieContainer(); 

    if(!string.IsNullOrWhiteSpace(sessionId)) 
      httpWebRequest.CookieContainer.Add(new Cookie("JSESSIONID", sessionId, "/", uri.Host)); 

    using(StreamWriter streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync())) { 
     await streamWriter.WriteAsync(json); 
     streamWriter.Flush(); 
     streamWriter.Close(); 
    } 

    HttpWebResponse httpResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync(); 
    Stream responseStream = httpResponse.GetResponseStream(); 
    if(responseStream == null) 
     throw new Exception("Response Stream was null!"); 

    using(StreamReader streamReader = new StreamReader(responseStream)) { 
     result = await streamReader.ReadToEndAsync(); 
    } 

    return result; 
} 
0

Sie können das Token direkt an Ihre URL hinzufügen:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create($"{url}?jsessionid={sessionId}"); 

Oder in den Header:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create({url); 
httpWebRequest.Headers["JSESSIONID"] = sessionId; 
+0

Ich habe das versucht, und ich bekomme immer noch eine negative Antwort vom Server. Ich bin mir nicht sicher, ob etwas anderes das Problem verursacht. –

+0

Sie sollten {url} ?; jsessionid = {sessionId} und {url}; jsessionid = {sessionId} versuchen, wenn es funktioniert. –