当前位置: 首页 > 编程语言 > C#

Uri.TryCreatethrowsUriFormatException-分享

时间:2023-04-10 13:47:53 C#

Uri.TryCreatethrowsUriFormatException?我有一个方法尝试创建一个Uri,然后清理它(删除片段、排除一些域和查询字符串模式等)。该方法如下所示:staticpublicboolTryCreateCleanUri(UribaseUri,stringrelstr,outUriresult){if(!Uri.TryCreate(baseUri,relstr,outresult)){returnfalse;}returnCleanupUri(result,outresult);这种方法已经存在了几个月。但是昨晚失败了。Uri.TryCreate()抛出异常!这是堆栈跟踪:错误:捕获到未处理的异常。程序终止。System.UriFormatException:无效的URI:无法解析主机名。在System.Uri.CreateHostStringHelper(Stringstr,UInt16idx,UInt16end,Flags&flags,String&scopeId)在System.Uri.CreateHostString()在System.Uri.GetComponentsHelper(UriComponentsuriComponents,UriFormaturiFormat)在System.Uri.CombineUri(UribasePart,StringrelativePart,UriFormaturiFormat)在System.Uri.GetCombinedString(UribaseUri,StringrelativeStr,BooleandontEscape,String&result)在System.Uri.ResolveHelper(UribaseUri,UrirelativeUri,String&newUriString,Boolean&userEscaped,UriFormatException&e)在System.Uri.TryCreate(UribaseUri,UrirelativeUri,Uri&result)在System.Uri.TryCreate(UribaseUri,StringrelativeUri,Uri&result)Uri.TryCreate(Uri,String,outUri)文档说如果返回值为True成功,否则为假,但它没有说明异常。但是,Uri.TryCreate(Uri,Uri,outUri)文档说:此方法构造URI,将其置于规范形式并对其进行验证。如果发生未处理的异常,此方法将捕获它。如果要创建Uri并获取异常,请使用其中一个Uri构造函数。堆栈跟踪显示异常是在Uri.TryCreate(Uri,Uri,outUri)处抛出的,根据文档,这不应该发生。这种情况非常罕见。几个月来我一直在使用该代码,通过它运行数十亿个URL,直到现在才遇到问题。不幸的是,我不知道是什么组合导致了这个问题。我希望构建一个显示错误的测试用例。这是Uri.TryCreate的已知错误,还是我遗漏了什么?我没有等待几个月让我的代码再次遇到这种情况,而是花了一些时间使用TryCreate弄清楚TryCreate在做什么,然后又花了一点时间找出重现错误的方法。Uri.TryCreate(UribaseUri,UrirelativeUri,outUriresult)崩溃的原因似乎是格式错误的baseUri。例如,Uri构造函数允许以下内容:UribadUri=newUri("mailto:test1@mischel.comtest2@mischel.com");根据mailto:URI的RFC,它不应该被允许。尽管构造函数创建并返回一个Uri对象,但尝试访问它的(某些)属性会抛出UriFormatException。例如,给定上面的代码,这一行将抛出异常:stringbadUriString=badUri.AbsoluteUri;我发现Uri类似乎使用两种不同的解析算法:一种在构造期间使用,另一种在内部用于获取各个组件。将这个无效的Uri传递给TryCreate将导致我在原始问题中描述的异常。TryCreate方法检查baseUri参数是否为null,但不(我想不能)验证它。必须假定,如果参数不为空,则传递的对象是完全初始化且有效的Uri实例。但在构建结果期间的某个时刻,TryCreate尝试获取baseUri的组件并抛出异常。我不能说我的程序实际上遇到了mailto:格式的URL。但是,我可以肯定地说无效的Uri对象是我的程序崩溃的原因,仅仅是因为我程序中的异常堆栈跟踪与测试程序中的堆栈跟踪匹配。简而言之,该错误存在于Uri构造函数(和TryCreate方法)中,它允许创建无效的Uri。您可以关注MicrosoftConnect上的错误报告。现在您知道它可能会失败,让我们获取更多信息:C#教程到此为止:Uri.TryCreatethrowsUriFormatException?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——staticpublicboolTryCreateCleanUri(UribaseUri,stringrelstr,outUriresult){try{if(!Uri.TryCreate(baseUri,relstr,outresult)){返回false;}}catch(UriFormatExceptionex){thrownewInalidOperationException(String.Format("CancreateURIforbase={0},rel={1}",baseUri.ToString(),relstr),ex);}返回CleanupUri(结果,输出结果);}publicstaticboolCheckUrlValid(stringurl){UriuriResult;boolresult=Uri.TryCreate(url,UriKind.Absolute,outuriResult);如果(结果){uriResult=newUri(url);如果(uriResult.Scheme==Uri.UriSchemeHttps||uriResult.Scheme==Uri.UriSchemeHttp)返回真;}返回假;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: