Laden...

Warum liefert gleicher Request vom Browser und vom HttpWebRequest anderes Ergebnis?

Erstellt von Exception234 vor 3 Jahren Letzter Beitrag vor 3 Jahren 559 Views
E
Exception234 Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren
Warum liefert gleicher Request vom Browser und vom HttpWebRequest anderes Ergebnis?

Huhu, hat hier jemand nen kleinen Tipp?

die Browseranfrage (FireFox,Edge) https://myserver/rest/api/2/search?jql=status%20=%20Open&maxResults=0 liefert:

startAt 0
maxResults 0
total	3651
issues []

die gleiche Anfrage via WebRequest liefert: startAt: 0, maxResults: 0; total: 0, issues: [] 🙁

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://myserver/rest/api/2/search?jql=status%20=%20Open&maxResults=0");
            
try
{        
request.Credentials =  new NetworkCredential(connection.username, connection.password);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
Console.WriteLine("Response stream received.");
Console.WriteLine(readStream.ReadToEnd());
response.Close();
readStream.Close();
}
catch (Exception e) { Console.WriteLine(e); }

Ich brauche den value "total" des Headers .. er bleibt immer 0

16.806 Beiträge seit 2008
vor 3 Jahren

Der gleiche Request wirds mit Sicherheit nicht sein, weil ein mal der Request vom Browser (und dessen Kontext) verschickt wird und ein mal von Deinem Code.
Unterschiede siehst Du am schnellsten mit einem Tool wie Fiddler. So sieht niemand ausser Du, worin sich die Requests unterscheiden; ergo kannst auch nur Du das prüfen 😉

Daher lad Dir https://www.telerik.com/fiddler und schau nach, was Firefox da wirklich verschickt, was Du eben so nicht siehst.
Alternativ kannst Du auch die Developer Tools zB von Chrome verwenden und Dir die Inhalte im Request Tab anschauen.

Was für eine solche REST API absolut untypisch ist, dass diese eine Basic Authentication verwendet und damit mit NetworkCredentials nutzbar wäre.
Normalerweise sind das Token-basierte APIs.

PS: Seit mehreren Jahren ist der WebRequest obsolete. Bitte den HttpClient verwenden.

E
Exception234 Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren

Danke dir Abt ... künftig nur noch HttpClient 😃


static HttpClient GetClient(string username, string password)
{
   AuthenticationHeaderValue authValue = new AuthenticationHeaderValue
   ("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));

   HttpClient client = new HttpClient()
   {
       DefaultRequestHeaders = { Authorization = authValue }
   };
    return client;
}

async Task request()
{
   HttpClient client = GetClient(connection.username, connection.password);
   string response = await client.GetStringAsync("https://myserver/rest/api/2/search?jql=status%20=%20Open&maxResults=0");
   Console.WriteLine(response);
}

16.806 Beiträge seit 2008
vor 3 Jahren

Dann direkt noch der Hinweis auf die HttpClient Doku: HttpClient nicht dauernd instanziieren sondern entweder die HttpClientFactory zu verwenen oder nur ein einziges Mal die Instanz erzeugen:

HttpClient is intended to be instantiated once and re-used throughout the life of an application. Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. This will result in SocketException errors. Below is an example using HttpClient correctly.