2017-07-11 2 views
0

J'ai la chaîne suivante dans laquelle je suis en train d'obtenir la valeur StatusCode:, sortie doit être 409 ..Je jugé comme suit de mais ne fonctionne pas, ce qui est la bonne façon de le faire?Comment rechercher une chaîne dans une chaîne en C#?

string output = 'QLASR: Bad Response Conflict StatusCode: 409, ReasonPhrase: 'Improper Software Product Build Name already present in the database', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Pragma: no-cache Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept Cache-Control: no-cache Date: Tue, 11 Jul 2017 22:18:26 GMT Server: Microsoft-IIS/8.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Length: 68 Content-Type: text/plain; charset=utf-8 Expires: -1 }' 

output.Any(x => x.Equals(StatusCode)) 
+0

Est-ce que le mot toujours 'StatusCode:' et sera une virgule toujours suivre la valeur? – maccettura

+0

@maccettura - Oui, votre hypothèse est correcte –

+0

De plus, cela ressemble JSON mal formé, est-il censé être JSON? – maccettura

Répondre

0
const string statusCodeIdentifier = "StatusCode:"; 
var outputWithoutSpaces = output.Replace(" ", ""); 
var statusCodeIndex = outputWithoutSpaces.IndexOf(statusCodeIdentifier); 
var parsedCode = outputWithoutSpaces.Substring(statusCodeIndex + statusCodeIdentifier.Length, 3); 

Pas la plus jolie, et cela suppose que les codes d'état sont toujours 3 chiffres. Mais en supposant que vos chaînes sont toujours de ce format, cela devrait fonctionner.

Vous avez mentionné dans les commentaires de la sortie est censé être JSON. Cela ne ressemblait pas à ce qui était le cas dans votre exemple de chaîne. Si c'est en fait JSON, j'utiliserais plutôt Newtonsoft.JSON pour désérialiser l'objet et le gérer comme ça. Ce serait beaucoup plus gérable.

2

Vous ne devriez pas avoir cette chaîne pour commencer. C'est un improperly read HttpResponseMessage. Il y a un code émission d'une requête HTTP quelque part, et à partir de là vous pouvez simplement appeler accéder à la propriété de réponse StatusCode:

httpClient = new HttpClient(); 
var response = await httpClient.GetAsync("..."); 

var statusCode = response.StatusCode; 
0

Vous trouverez l'index de StatusCode:, utiliser cet index et trouver la sous-chaîne de cet indice à l'indice de , (vous devrez utiliser la longueur de StatusCode: pour obtenir la valeur)

0

Une expression régulière semble être la meilleure option ici.

int statusCode = 0; 
string output = 'QLASR: Bad Response Conflict StatusCode: 409, ...' 
string pattern = @"StatusCode\:\s?(\d+)"; 
Regex r = new Regex(pattern, RegexOptions.IgnoreCase); 
Match m = r.Match(output); 
if (m.Success) 
{ 
    statusCode = (int)m.Groups[1].Value; 
    Debug.WriteLine(statusCode); 
} 

Cette expression régulière cherche « StatusCode » suivi par deux points, suivi par un espace (ou non), suivi par plusieurs chiffres. Les parenthèses vous permettent de grouper des choses.

Ainsi, lorsque cette expression régulière est exécuté, il correspond à votre sortie et trouve de la StatusCode: 409 '. Nous utilisons ensuite le groupe 1, qui contient la valeur entre parenthèses, pour obtenir le code d'état souhaité. (Groupe 0 = la totalité de la correspondance, donc ce serait 'StatusCode: 409')

Mais tbh, votre 'sortie' ressemble au code de réponse de HttpClient. Et je suis sûr que la réponse a une propriété StatusCode accessible au public.