4

我在使用自定义协议通过浏览器打开本地文件时遇到了一些实际问题。现在,在您为自定义协议开枪之前,此 Web 应用程序将在封闭的 Intranet 环境中运行,因此我可以完全控制为所有用户添加这些协议。该应用程序目前运行良好,但我被要求绕过文件的打开/保存对话框,因为它“烦人”和“耗时”(是的,我知道......我试图告诉他们),所以在这里我在未知领域!

这是一个不起作用的示例(我在此示例中使用记事本在带有 IIS7 的 Server 2008 R2 中对其进行测试):

使用关于将应用程序注册到 URL 协议的信息,我已将以下内容添加到注册表中:

HKEY_CLASSES_ROOT
 opentxt
      (Default) = "URL:opentxt Protocol"
      URL Protocol = ""
      DefaultIcon
           (Default) = "C:\Windows\System32\notepad.exe,1"
      shell
           open
                command
                     (Default) = "C:\Windows\System32\notepad.exe" "%1"

所以现在,理论上,它应该像在我的 html 中包含以下链接一样简单

<a href="opentxt://localhost/openme.txt">Open File</a> 

它几乎可以工作 - 单击链接,它会立即打开记事本,但是我在记事本中遇到了这个错误。

The filename, directory name, or volume label syntax is incorrect

该文件肯定存在于该位置(我可以使用 读取它http: //localhost/openme.txt),并且我尝试以多种不同格式表示链接,例如此处所述,但无法使其正常工作。

有什么想法我哪里出错了吗?

4

1 回答 1

3

很简单,您混淆了两种不同的协议。

您的协议 - 以及您传递给记事本的 Url - 是opentxt://localhost/openme.txt. 该文件的工作位置是http: //localhost/openme.txt. 这两个不一样!

HTTP 是一种操作系统本身可以理解的协议,因此,记事本可以将 HTTP Url 传递给操作系统,操作系统反过来localhost使用端口 80 连接并发送对该资源的请求。文件被返回,记事本有它的数据。这一切都在定义 HTTP 行为的操作系统库中处理。

除非您对其进行编码,否则您的opentxt协议没有此支持。记事本不知道如何处理它 - 所以您会看到错误消息。

一种轻松处理此问题的方法是创建自己的处理协议的应用程序。如果您opentxtHandler.exe通过注册表连接,它将被传递opentxt://url,然后可以适当地处理它。这可能只是意味着将协议从opentxtto更改为http然后将其传递给记事本 - 或者它可能更复杂。

于 2012-08-23T10:35:19.407 回答