J'ai une méthode qui tente de créer une URI puis de le nettoyer (supprime des fragments, exclut certains domaines et des schémas de chaîne de requête, etc.). La méthode ressemble à ceci: Cette méthode fonctionne bien pendant des mois. Mais la nuit dernière, il a échoué. Uri.trycreate () a jeté une exception! Voici la trace de la pile: p> documentation pour Cette méthode construit l'URI, met
il sous forme canonique et valide
ce. Si une exception non gérée survient,
Cette méthode l'attrape. Si tu veux
créer une URI et obtenir des exceptions
un des constructeurs d'URI. P>
blockQuote> La trace de la pile montre que l'exception a été lancée dans C'est un événement très rare. J'utilise ce code pendant des mois, exécutant littéralement des milliards d'URL à travers elle et n'ont pas rencontré de problème jusqu'à présent. Malheureusement, je ne sais pas quelle combinaison de choses a causé le problème. J'espère construire un étui à essai indiquant l'erreur. P> est-ce un bug connu dans uri.trycreate (URI, chaîne, sortie URI) code> dit que la valeur de retour est true Code> En cas de succès, faux code> sinon, mais il est silencieux sur les exceptions. Toutefois, la documentation pour uri.trycreate (URI, URI, URI) code> dit: p>
uri.trycreate (Uri, Uri, Out Uri) code>, qui, selon la documentation, ne devraient pas arriver. p> uri.trycreate code>, ou je manque quelque chose? P> p>
3 Réponses :
Maintenant que vous savez que cela peut échouer, prenons plus d'informations:
J'ai ajouté du code similaire à mon application. Malheureusement, cela pourrait être plusieurs jours (semaines ou mois) avant que l'erreur soit déclenchée. J'essaie de construire un cas de test.
D'accord. Notez que la partie importante est de capturer et d'afficher les deux paramètres d'entrée pour trycreate. Je parie que la réponse vous sautera lorsque vous le verrez, surtout que vous aurez également la trace de la pile.
Ne veut pas attendre plusieurs mois pour que mon code rencontre à nouveau cette situation, j'ai passé du temps avec Ilasm pour comprendre ce que La raison de l'accident dans selon le RFC pour le mailto: URIS, qui ne devrait pas être autorisé. Et bien que le constructeur crée et renvoie un objet Je trouve cela plutôt intéressant que la classe transmettre ce non valide Je ne peux pas dire que Mon programme a réellement rencontré un mailto: URL qui a été formatée de cette façon. Je peux dire avec un certain degré de certitude, cependant, qu'un objet Vous pouvez suivre le Signaler de bogues sur Microsoft Connecter. P> P> trycreate code> fait, puis un peu plus de temps à venir avec une manière Pour reproduire l'erreur. uri.trycree (URI BASEURI, URI RelativeURI, OUT URI) code> semble être un BASEURI code>. Par exemple, le constructeur uri code> permet les éléments suivants: p> uri code>, essayant d'accéder à (certaines des) ses propriétés lancent uformatException code>. Par exemple, étant donné le code ci-dessus, cette ligne lancera une exception: p> uri code> semble utiliser deux Différents algorithmes d'analyse: une utilisée pendant la construction, et l'une utilisée en interne pour obtenir les composants individuels. p> uri code> à trycreate code> entraînera le exception que j'ai décrit dans la question initiale. Le trycreate code> vérifie le paramètre baseuri code> pour null code>, mais je ne peux pas, j'imagine) le valider le contraire. Il doit supposer que si le paramètre est non nul, l'objet transduit est une instance URI URI code>. Mais à un moment donné de construire le résultat, trycreate code> tente d'obtenir les composants de baseuri code> et une exception est lancée. P> URI code> non valide était la cause de l'accident dans mon programme, simplement parce que la trace de la pile d'exception de mon programme correspond à la trace de la pile à partir du programme de test . Il suffit de mettre, le bug est dans le constructeur URI code> (ainsi que dans les méthodes code> trycreate code>) qui permettent à l'URI code> invalide code> à créer. p>
public static bool CheckUrlValid(string url)
{
Uri uriResult;
bool result = Uri.TryCreate(url, UriKind.Absolute, out uriResult);
if(result)
{
uriResult = new Uri(url);
if (uriResult.Scheme == Uri.UriSchemeHttps || uriResult.Scheme == Uri.UriSchemeHttp)
return true;
}
return false;
}
Cela semble bien fonctionner pour moi. Si vous essayez d'utiliser la variable URI sans l'initialiser, cela provoquera une erreur.
Bienvenue à Stackoverflow! Lorsque vous avez posté des réponses aux questions, veuillez publier plus que votre code. Expliquez-le, montre que c'est une utilisation, faites n'importe quoi pour rendre votre réponse aussi claire que possible, mais une réponse doit toujours être plus que celle du code. Merci et bonne chance!
Merci pour la pensée, mais c'est environ sept ans trop tard et ne répond pas vraiment à la question. Vous voyez, mon point était que uri.trycreate code> jetait une exception qu'il n'aurait pas dû lancer. Votre solution proposée ne voudrait pas aider. J'ai finalement identifié le problème à l'aide du code similaire à ce que John Saunders a proposé dans sa réponse. C'est-à-dire, attrapez l'exception et sortie l'URL qui a déclenché l'erreur.
Savez-vous quelle url il essaie d'analyser qui causant l'échec?
Si je savais ça, je l'aurais posté.
Utilisez le réflecteur pour savoir ce que «trycreate» fait