У меня есть следующий код для открытия URL в браузере по умолчанию:
string url;
//...
Process.Start(url);
Но он потерпит неудачу и выдаст Win32Exception
с некоторым URL, например:
https://tw.news.yahoo.com/%E6%95%B8%E4%BD%8D%E8%BA%AB%E5%88%86%E8%AD%89%E6%93%AC9%E6%9C%88%E6%8F%90%E6%A8%A3%E5%BC%B5-%E5%BE%90%
Трассировка стека выглядит так:
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified.
at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start()
at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start(String fileName)
at MyApp.GoURL(String url)
Я переключал глухих браузеров с Firefox на Chrome, Edge, Brave, ... и т. Д.
И я попытался несколько обходных путей в этой проблеме дотнет ,
Process.Start(
new ProcessStartInfo("cmd", $"/c start {url}")
{ CreateNoWindow = true });
или же
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = url,
UseShellExecute = true
};
Process.Start(psi);
но все равно не повезло, я не могу открыть браузер по умолчанию. Сообщение об ошибке все еще The system cannot find the file specified.
Как я могу открыть такой URL в любом браузере по умолчанию?
Всего 1 ответ
Вы можете позволить классу UriBuilder выполнить работу по декодированию за вас.
string urlEncoded = @"https://tw.news.yahoo.com/%E6%95%B8%E4%BD%8D%E8%BA%AB%E5%88%86%E8%AD%89%E6%93%AC9%E6%9C%88%E6%8F%90%E6%A8%A3%E5%BC%B5-%E5%BE%90%";
var builder = new UriBuilder(urlEncoded);
Process.Start(builder.ToString());
На самом деле это всего лишь небольшая модификация исходной строки с добавлением служебного порта, но этого достаточно, чтобы строка стала распознанным URL-адресом.
Это не сработает, если вы попытаетесь декодировать его, используя класс WebUtility :
string urlDecoded = WebUtility.UrlDecode(urlEncoded);
Process.Start(urlDecoded); // Fail