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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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);
}
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code