У меня есть метод, который пытается создать 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
, или я что-то не хватает?