Je veux envoyer un SMS depuis mon application. SMS sera envoyé lorsque j'enverrai une demande d'extraction à une URL spécifique. Toutes mes méthodes sont asynchrones, mais lorsque j’ai utilisé une HttpClient
et que je veux utiliser response.Content.ReadAsStringAsync()
, j’ai supprimé await
.
Je ne veux pas attendre la réponse de cette méthode et je veux envoyer une requête à cette URL uniquement. Maintenant, pouvez-vous me dire que c'est une bonne solution?
Ceci est mon exemple de code:
public async Task<bool> SendMessage(string number, string body)
{
var from = _config["SMSSenderSettings:FromNumber"];
var username = _config["SMSSenderSettings:PanelUserName"];
var password = _config["SMSSenderSettings:PanelPassword"];
using (var client = new HttpClient())
{
try
{
var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
$"&to={number}&text={body}&type=0&username={username}&password={password}");
response.EnsureSuccessStatusCode(); // Throw exception if call is not successful
response.Content.ReadAsStringAsync();
return true;
}
catch (HttpRequestException)
{
return false;
}
}
}
J'ai supprimé await
de response.Content.ReadAsStringAsync();
et je reçois un avertissement.
Si vous ne souhaitez pas attendre votre tâche, vous pouvez supprimer le type de retour indésirable.
public async Task SendMessage(string number, string body)
{
var from = _config["SMSSenderSettings:FromNumber"];
var username = _config["SMSSenderSettings:PanelUserName"];
var password = _config["SMSSenderSettings:PanelPassword"];
using (var client = new HttpClient())
{
try
{
var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
$"&to={number}&text={body}&type=0&username={username}&password={password}");
response.EnsureSuccessStatusCode(); // Throw exception if call is not successful
await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException)
{
}
}
}
Ensuite, vous pouvez appeler la SendMessage
depuis une autre méthode comme-
await SendMessage().ConfigureAwait(false);
Note : Ceci n'est pas recommandé car vous ne saurez pas si votre tâche se termine avec succès ou non.
Il y a encore d'autres moyens de réaliser ce que vous voulez. Vous pourriez en lire quelques-uns-
Ce n'est pas une bonne idée. Quelque part dans votre code, vous devriez await
/Wait
/.Result
la Task
, sinon les exceptions non gérées produiront jusqu'au niveau de l'application voir docs
C'est le radon pour l'avertissement, le compilateur ne veut pas vous laisser vous tirer une balle dans le pied. Si vous voulez vraiment aller de l'avant avec cela, placez simplement la tâche dans une variable et ne l'utilisez jamais, bien que d'autres outils d'analyse statique puissent le signaler.
var t = response.Content.ReadAsStringAsync();
Ou si l'appel n'est pas nécessaire pour compléter la demande, vous pouvez envisager de le supprimer complètement.
Si le contenu de la réponse n'est pas nécessaire, ne le lisez pas du tout. Et vous ne devriez pas jeter d'exceptions, quand vous pouvez les éviter.
Avec cela, vous pouvez avoir un code beaucoup plus propre
public async Task<bool> SendMessage(string number, string body)
{
var from = _config["SMSSenderSettings:FromNumber"];
var username = _config["SMSSenderSettings:PanelUserName"];
var password = _config["SMSSenderSettings:PanelPassword"];
using (var client = new HttpClient())
{
var response = await client.GetAsync($"{BaseUrl}/send.php?method=sendsms&format=json&from={from}" +
$"&to={number}&text={body}&type=0&username={username}&password={password}");
return response.IsSuccessStatusCode();
}
}