Открытый URL Process.Start () иногда вызывает Win32Exception?

У меня есть следующий код для открытия 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

Есть идеи?

10000