【问题标题】:Open windows explorer in a blazor (Server Side) application在 blazor(服务器端)应用程序中打开 Windows 资源管理器
【发布时间】:2021-07-06 14:11:08
【问题描述】:

我正在开发一个 Blazor 服务器端应用程序,该应用程序仅在我们的网络中使用。该应用程序处理建筑许可证。到目前为止一切顺利。

从历史上看,许可证是手动完成的,所有相关文件(蓝图、信件等)都保存在我们的文件服务器上并通过 Windows 资源管理器访问。

为了能够保持相同的文件处理工作流程,我的任务是从 Blazor 应用打开 Windows 资源管理器。

我很清楚这远非推荐,我尝试说服人们不要这样做,但无济于事。

那么:有没有办法直接在 Windows 资源管理器中打开特定位置。我知道您可以链接到 HREF="file:\my-server\path\to\share",但这仅显示目录列表。没有办法添加文件、复制、粘贴、重命名等等……

更新(2021-07-08): 这是在受控环境中。该应用程序不公开。我永远不会为公共应用程序做这样的事情。使用该应用程序的人非常有限,并且会了解该功能。

【问题讨论】:

  • Process.Start?老式的方式,老式的工作流程? thread我不确定这是否可行,但你可以试一试......
  • 其实可能不会。这是一个关于使用自定义文件处理程序协议的线程,也许这是一种方式? link
  • 这只适用于开发机器,因为 Process.Start 在服务器上启动进程。在作为服务器和客户端打开 Windows Epxlorer 的 DEV 中是相同的。但是,它在生产中不起作用。服务器无法在客户端启动进程
  • 您所要求的并非特定于 Blazor。相反,您应该问问自己,作为 Web 浏览器的用户,您是否曾在任何地方看到过此功能。旧版本的 Internet Explorer 可能会出现这种情况,但任何现代浏览器都不可能。
  • @Nikki9696 为我指明了正确的方向。使用自定义 URI 处理程序似乎有效。第一个简化测试很有希望。

标签: .net-core blazor blazor-server-side windows-explorer


【解决方案1】:

除非您为浏览器(或您自己的浏览器)制作插件,否则您无法从客户端上的浏览器打开资源管理器。

即使您可以从 Blazor 服务器打开资源管理器,它也会在服务器上打开,而不是在客户端上。

也就是说,现在制作自己的浏览器(支持该浏览器)不一定是一项复杂的任务(看看CefSharpWebView2 或类似的),如果有可能的话,但那是不可能的或者应该在这个问题中解释。

或者您可以在网络上制作自己的文件浏览器(使用 Blazor 组件)。

但绝对不能从浏览器打开资源管理器...如果您在标准浏览器上找到方法,请报告它,因为这是一个巨大的安全漏洞。

【讨论】:

  • 我目前正在尝试添加我自己的自定义 URI 方案处理程序,这似乎有效。鉴于我处于受控环境中,这应该可以正常工作。我只需要在客户端上添加必要的注册表项
【解决方案2】:

如果您可以这样做,那将是 Blazor 中的一个错误,Microsoft 必须立即修补它。这是一个可怕的、可怕的想法。就像——非常可怕。

如果人们要访问单个机器上的文件,那么您需要为这些机器编写应用程序,而不是 Web 应用程序。也许他们可以将文件上传到服务器。

如果您可以在 IIS 服务器上托管所有文件(我假设),那么您必须配置文件夹、链接、虚拟目录等。

【讨论】:

  • 我很清楚这是一个可怕的想法。似乎仍然可以使用自定义 URI 方案处理程序。
【解决方案3】:

对于那些需要做同样事情的人,我想出了如何去做。 Nikki9696 在他的 cmets 中为我指明了正确的方向。

浏览器不会直接在客户端上打开 Windows 资源管理器(正如其他答案中指出的那样,这是一件非常好的事情)。但是我实现了custom URI Scheme

下面是简化版的代码:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            string path = string.Empty;
            path = args[0].Replace("my-app:", string.Empty);
            path = System.Web.HttpUtility.UrlDecode(path);
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }
            System.Diagnostics.Process.Start("explorer.exe", path);
        }
        else
            Console.WriteLine("No Argument specified");
    }
}

这行得通。我只需要在客户端注册表中添加自定义 URI 方案。

【讨论】:

    【解决方案4】:

    在 blazor 中完成此操作的唯一方法是使用自定义协议。

    创建一个简单的 C# 控制台应用程序并将编译后的 exe 绑定到您的协议。该协议需要安装在所有客户端 PC 上(您可以通过组策略执行此操作)。

    在您的 blazor 应用程序中,您将使用任何参数链接到您的自定义协议。

    请记住,您每次都需要打开一个新标签,因为 https://github.com/dotnet/aspnetcore/issues/29259

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2023-01-19
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多