Открытый URL Process.Start () иногда вызывает Win32Exception? - PullRequest
0 голосов
/ 16 мая 2019

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

Существует несколько решений , открывающих Internet Explorer, но они не соответствуют моим спецификациям.

Как я могу открыть такой URL в любом браузере по умолчанию?

1 Ответ

0 голосов
/ 16 мая 2019

Вы можете позволить классу 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 class:

 string urlDecoded = WebUtility.UrlDecode(urlEncoded);
 Process.Start(urlDecoded);  // Fail
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...