【问题标题】:UriFormatException when using %40 instead of @ in mailto: protocol在 mailto: 协议中使用 %40 而不是 @ 时出现 UriFormatException
【发布时间】:2014-01-29 03:06:17
【问题描述】:

我正在编写一个默认邮件客户端来处理当有人点击 mailto:bob@example.com

craigslist mailto 链接的格式为 mailto:bob%40example.com
使用它时出现异常。
这是一些在c#中重复问题的简单代码

System.Uri u1 = new Uri(@"mailto:bob@ms.com");  // ok so far
System.Uri u2 = new Uri(@"http://somewhere.foo/profile/username%40somewhere.foo"); // still ok
System.Uri u3 = new Uri(@"mailto:bob%40ms.com");  // crash here

问题1:
mailto:bob%40example.com 不应该是一个有效的 uri

问题2:
如果它是一个无效的 uri,那么 Outlook 如何不会在它上面崩溃。

我正在使用 Visual Studio 2012

【问题讨论】:

  • 我不会为此烦恼,除非这是在 craigslist (qzgwf-4265487696%40sale.craigslist.org?...) 中看到的。

标签: c# uri mailto


【解决方案1】:

定义了 mailto 协议的 RFC 6068 (http://www.ietf.org/rfc/rfc6068.txt) 是否指定 %40 是替换 @ 作为用户名/域分隔符的有效语法。

它确实指定如果用户名包含@,例如hello@you@domain.com,您可以使用%40 将其转义为hello%40you@domain.com。但它没有任何地方声明 hello%40domain.com 将是一个有效的 mailto URI。

如果微软决定在 Outlook 中支持它,那仍然不会改变权威的 RFC 没有定义它的事实——所以我想说,微软可能出于以下原因将其加入健壮性,或者可能是他们为 %xx 语法解析任何 URI 的副作用......

【讨论】:

  • 我的问题是我正在 Windows 应用商店中编写一个快速而肮脏的电子邮件客户端,而 craigslist 邮件链接使用 %40 而不是 @ 符号。我把代码放在pastebin.com/HuPA96N3 上。崩溃发生在第 85 行。您知道任何解决方法吗?
  • 您确定在var _args = args as ProtocolActivatedEventArgs; 行之后,您的变量_args 不是null
  • 我刚查了一下,不为空,它甚至有_args.SplashScreen和_args.PreviousExecutionState的有效值,我认为System.Uri类中有一个错误,我放了一些简单的代码pastebin.com/9WX1skzt 我认为 mailto:bob%40ms.com 是一个有效的 uri,因为这是 craigslist 使用的,并且 Outlook 可以使用它,所以至少微软知道解决方法
  • (可选)我想访问传递给使用 mailto 协议激活的 Windows 应用程序的原始参数。然后我可以将 %40 更改为 @我自己并创建一个新的 System.Uri 实例。
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多