C# 在mailto:协议中使用%40而不是@时发生UriFormatException

C# 在mailto:协议中使用%40而不是@时发生UriFormatException,c#,uri,mailto,C#,Uri,Mailto,我正在编写一个默认邮件客户端,以便在有人单击mailto时处理:bob@example.com craigslist mailto链接的形式为mailto:bob%40example.com 使用此选项时会出现异常。 下面是一些简单的代码来重复c# 问题1: 不应将mailto:bob%40example.com作为有效的uri 问题2: 如果它是一个无效的uri,那么outlook如何不在其上崩溃。 我正在使用visual studio 2012RFC 6068(),它定义了mailto协议

我正在编写一个默认邮件客户端,以便在有人单击mailto时处理:bob@example.com

craigslist mailto链接的形式为mailto:bob%40example.com
使用此选项时会出现异常。
下面是一些简单的代码来重复c#

问题1:
不应将mailto:bob%40example.com作为有效的uri

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

我正在使用visual studio 2012

RFC 6068(),它定义了mailto协议,但没有指定%40是一种有效的语法,可以将@替换为用户名/域分隔符

它确实指定如果用户名包含@,例如在案例
hello@you@domain.com
,您可以使用%40将其转义到
hello%40you@domain.com
。但是它没有说明
hello%40domain.com
将是有效的mailto URI

如果微软决定在Outlook中支持它,这仍然不会改变一个事实,即权威的RFC并没有定义它——所以我想说,微软可能是出于健壮性的原因,或者可能是他们解析任何URI的一个副作用…

RFC6068(),它定义了mailto协议,是否指定%40是将@替换为用户名/域分隔符的有效语法

它确实指定如果用户名包含@,例如在案例
hello@you@domain.com
,您可以使用%40将其转义到
hello%40you@domain.com
。但是它没有说明
hello%40domain.com
将是有效的mailto URI


如果微软决定在Outlook中支持它,这仍然不能改变一个事实,即权威的RFC并没有定义它——所以我想说,微软可能是出于健壮性的原因而把它放进去的,或者,这可能是他们解析%xx语法的任何URI的副作用…

我的问题是,我正在windows app store中编写一个快速而肮脏的电子邮件客户端,craigslist mailto链接使用%40而不是@sign。我把密码放在电脑上。事故发生在85号线。您知道任何解决方法吗?您确定在
var\u args=args作为ProtocolActivatedEventArgs行之后
,您的变量
\u args
不是
null
?我刚刚检查过,它不是null,它甚至有_args.SplashScreen和_args.PreviousExecutionState的有效值,我想System.Uri类中有一个bug,我在网站上发布了一些简单的代码,我认为mailto:bob%40ms.com是一个有效的uri,因为craigslist正在使用这个uri,而且outlook也在使用它,所以至少微软知道有一个解决办法。我希望能够访问传递给使用mailto协议激活的windows应用程序的原始参数。然后,我可以将%40更改为@imf,并创建一个新的System.Uri实例。我的问题是,我正在windows app store和craigslist mailto链接中编写一个快速而肮脏的电子邮件客户端,使用%40而不是@sign。我把密码放在电脑上。事故发生在85号线。您知道任何解决方法吗?您确定在
var\u args=args作为ProtocolActivatedEventArgs行之后
,您的变量
\u args
不是
null
?我刚刚检查过,它不是null,它甚至有_args.SplashScreen和_args.PreviousExecutionState的有效值,我想System.Uri类中有一个bug,我在网站上发布了一些简单的代码,我认为mailto:bob%40ms.com是一个有效的uri,因为craigslist正在使用这个uri,而且outlook也在使用它,所以至少微软知道有一个解决办法。我希望能够访问传递给使用mailto协议激活的windows应用程序的原始参数。然后,我可以将%40改为@imf并创建一个新的System.Uri实例。我不会为此烦恼,除非这在craigslist(qzgwf-4265487696%40sale.craigslist.org?…)中看到。我不会为此烦恼,除非这在craigslist(qzgwf-4265487696%40sale.craigslist.org?…)中看到
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