单击电子邮件中的链接时如何避免启动浏览器

Joh*_*ams 8 vb.net email-client http asp.net-mvc-4 asp.net-web-api

目前,我的部分应用程序会向用户发送电子邮件,提醒他们注意事件或任务.当点击一个MarkComplete在电子邮件客户端的链接,一个HTTP GET请求我做ActionHandler.ashx(一个HttpHandler),其中的查询字符串参数的输入,允许事件/任务的更新.然后将新的电子邮件发送回客户端信令完成.这有效.

这种HTTP GET对处理程序的不良副作用是启动浏览器(即此时,浏览器的打开是不必要的并且是令人讨厌的).

前提:当我研究ASP.Net Web Api时,我想我可能能够将HTTPHandler中的少量代码重构为Web API控制器中的PUT方法.我的理解是,在执行上述所需的处理之后,该控制器可以用无效返回(HTTP状态代码204)进行响应.

问题:Web API控制器中新编写的PUT方法中的上述方法是否会返回204,这是否会阻止浏览器完全启动?我希望最终用户点击他第一封电子邮件中的链接,只获得新构建的电子邮件信号"完成"(此处根本没有浏览器).

编辑澄清2016年5月22日:

  • 我不需要"用户互动".理想情况下,用户点击并且没有任何事情发生在用户身上,而不是新的"回复电子邮件"表明任务成功完成.
  • 下面的建议答案中列出的选项2已经尝试失败,一些主要的电子邮件程序不允许这样做 - 请参阅:提交给HttpHandler导致RequestType GET而不是POST
  • 请注意,当前发出的HTML电子邮件内容包含任何包含邮件中链接标记的HTML表单标记.
  • 我还有没有选择吗?我已经读过HTTP PUT可以处理一个查询字符串(我只是不确切知道如何这样做......)

Fed*_*uma 5

简短的回答:没有

如果您需要用户交互,则无法在不打开浏览器的情况下从电子邮件客户端执行 HTTP 请求。

大多数电子邮件客户端(包括网络邮件)不允许您执行 JavaScript代码,因此您无法选择在后台执行某些操作。

这意味着您有两个选择:

  1. 在您的电子邮件中创建一个链接,这将导致GET向您的 Web 服务器发出请求(这是您已经完成的)。当然,这会导致浏览器打开该页面。
  2. 在您的 Email 中创建一个 HTML 表单,其中包含一个包含您的数据的隐藏字段,该表单将针对POST您的 Web 服务器内已启用的端点。这也会导致 Web 浏览器被打开(并且在某些情况下也可能会显示警告消息),但可以让您更好地处理要发送的数据类型。但是,这种方法似乎与特定的客户端行为紧密相关(例如,Thunderbird 将每个表单提交都转换为GET请求),因此我认为这是不可行的。

除了这两个选项,我相信你没有其他可能性。这背后的原因纯粹与安全有关:如果您能够在电子邮件消息中执行 JavaScript 代码,那将是非常不安全的。

204 响应

可以做的是将端点的响应转换为204(如您所建议的那样)。请注意,这也会导致您的浏览器打开,但它几乎会立即关闭响应 204 的选项卡(确切行为取决于电子邮件客户端和 Web 浏览器的组合)。我想,即使你不改变你的代码库,并继续使用这个很容易做到ActionHandler.ashx,但如果你想,当然是容易的ASP.NET Web API由刚做完返回voidActionMethod

关于PUT方法:

GETPOST在 HTML 表单中并且是允许的方法,而任何类型的<a href="... ">...</a>标记都会始终生成GET请求。这意味着您将无法PUT在电子邮件消息中执行该方法(无论在哪种环境中阅读电子邮件)。