在默认浏览器中从c#打开数据URI

时间:2014-03-07 14:12:04

标签: c# browser uri

我有一个数据URI的字符串。例如

string dataURI = data:text/html,<html><p>This is a test</p></html>

然后我使用

调用Web浏览器
System.Diagnostics.Process.Start(dataURI)

但网页浏览器无法打开,我只是收到错误。当我将数据URI粘贴到浏览器地址栏时,它会打开页面。

任何人都可以帮助我并告诉我我做错了什么吗?

谢谢Tony,

1 个答案:

答案 0 :(得分:2)

根据article

  
    

ShellExecute解析传递给它的字符串,以便ShellExecute可以提取协议说明符或扩展名。接下来,ShellExecute在注册表中查找,然后使用协议说明符或扩展名来确定要启动的应用程序。如果将http://www.microsoft.com传递给ShellExecute,ShellExecute会将http://子字符串识别为协议。

  

在您的情况下,没有http子字符串。因此,您必须显式传递默认浏览器可执行文件作为文件名和数据URI作为参数。我使用了article中的GetBrowserPath代码。

string dataURI = "data:text/html,<html><p>This is a test</p></html>";
string browser = GetBrowserPath();
if(string.IsNullOrEmpty(browser))
    browser = "iexplore.exe";
System.Diagnostics.Process p = new Process();
p.StartInfo.FileName = browser;
p.StartInfo.Arguments = dataURI;
p.Start();

private string GetBrowserPath()
{
    string browser = string.Empty;
    Microsoft.Win32.RegistryKey key = null;
    try
    {
        // try location of default browser path in XP
        key = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(@"HTTP\shell\open\command", false);
        // try location of default browser path in Vista
        if (key == null)
        {
            key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http", false); ;
        }
        if (key != null)
        {
            //trim off quotes
            browser = key.GetValue(null).ToString().ToLower().Replace("\"", "");
            if (!browser.EndsWith("exe"))
            {
                //get rid of everything after the ".exe"
                browser = browser.Substring(0, browser.LastIndexOf(".exe") + 4);
            }                    
        }
    }
    finally
    {
        if (key != null) key.Close();
    }
    return browser;
}