У меня есть метод, который пытается создать Uri, а затем очистить его (удаляет фрагменты, исключает некоторые домены и шаблоны строк запросов и т. Д.). Метод выглядит так:
static public bool TryCreateCleanUri(Uri baseUri, string relstr, out Uri result)
{
if (!Uri.TryCreate(baseUri, relstr, out result))
{
return false;
}
return CleanupUri(result, out result);
}
Этот метод работал отлично в течение нескольких месяцев. Но прошлой ночью это не удалось. Uri.TryCreate () выдал исключение! Вот трассировка стека:
ERROR: Unhandled exception caught. Program terminating.
System.UriFormatException: Invalid URI: The hostname could not be parsed.
at System.Uri.CreateHostStringHelper(String str, UInt16 idx, UInt16 end, Flags& flags, String& scopeId)
at System.Uri.CreateHostString()
at System.Uri.GetComponentsHelper(UriComponents uriComponents, UriFormat uriFormat)
at System.Uri.CombineUri(Uri basePart, String relativePart, UriFormat uriFormat)
at System.Uri.GetCombinedString(Uri baseUri, String relativeStr, Boolean dontEscape, String& result)
at System.Uri.ResolveHelper(Uri baseUri, Uri relativeUri, String& newUriString, Boolean& userEscaped, UriFormatException& e)
at System.Uri.TryCreate(Uri baseUri, Uri relativeUri, Uri& result)
at System.Uri.TryCreate(Uri baseUri, String relativeUri, Uri& result)
Документация для Uri.TryCreate(Uri, String, out Uri)
говорит, что возвращаемое значение равно True
в случае успеха, False
в противном случае, но об исключениях ничего не говорится. Тем не менее, документация для Uri.TryCreate(Uri, Uri, out Uri)
гласит:
Этот метод создает URI, помещает
это в канонической форме, и подтверждает
Это. Если происходит необработанное исключение,
этот метод ловит это. Если хотите
создать Uri и получить исключения использования
один из конструкторов Uri.
Трассировка стека показывает, что исключение было сгенерировано в Uri.TryCreate(Uri, Uri, out Uri)
, что, согласно документации, не должно происходить.
Это очень редкое явление. Я использовал этот код в течение нескольких месяцев, пропуская через него буквально миллиарды URL, и до сих пор не сталкивался с проблемой. К сожалению, я не знаю, какое сочетание вещей вызвало проблему. Я надеюсь построить тестовый пример, который показывает ошибку.
Это известная ошибка в Uri.TryCreate
или я что-то упустил?