我正在使用uniqueidentifier
来验证ASP.NET应用程序中用户的电子邮件地址。当我尝试使用uniqueidentifier
验证任何电子邮件地址时,我可以毫无问题地这样做。但是,80%的用户不能这样做。我无法弄清楚为什么会这样!我让用户直接给我发电子邮件,转发他们的激活电子邮件,我可以毫无问题地激活他们的帐户。
以下是电子邮件中验证链接的示例。
mysite.org/petition.aspx?uid=0fcc9582-386c-4738-943d-36e09c8df4bd
以下是发生的例外情况:
problem loading petition screen: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).:
at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)
at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)
at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
at System.Guid..ctor(String g)
at MAP.Umbraco.UserControls.SignPetitionUserControl.get_PetitionGuid()
at MAP.Umbraco.UserControls.SignPetitionUserControl.OnLoad(EventArgs e)
UPDATE:这是我的PetitionGuid属性的get方法。
private Guid? PetitionGuid
{
get
{
if (Page.Request.QueryString["uid"] == null)
return null;
else
return new Guid( Page.Request.QueryString["uid"].ToString());
}
}
我有什么明显的遗失吗?
随意提出您可能需要提出的任何问题。
答案 0 :(得分:2)
你错过了一个角色。
0fcc9582-386c-4738-943d-36e09c8df4b <---
12345678 1234 1234 1234 123456789012
<强>更新强>
根据您的上述更新,您对请愿指南的实施不是非常具有防御性。
private Guid? PetitionGuid
{
get
{
if (Page.Request.QueryString["uid"] == null)
return null;
else
return new Guid( Page.Request.QueryString["uid"].ToString());
}
}
所以基本上,如果uid
参数是除了null之外的任何东西,(一个数字,随机字符串,其他垃圾)你将尝试将它变成一个guid。这显然会导致失败...进行一些登录,并记录正在提交的UID的值。
你可能应该使用像tryParse这样的东西,而不仅仅是尝试异常。
if(string.IsNullOrEmpty(s))
Console.WriteLine("Null or Empty");
Guid g;
Guid.TryParse(s, out g);
if(g == Guid.MinValue)
Console.WriteLine("Couldn't Parse");
else
Console.WriteLine("G: {0}", g);
答案 1 :(得分:1)
Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
这些0fcc9582-386c-4738-943d-36e09c8df4b
符合要求吗?你在最后一部分失去了一位数。你有11位而不是12位。
答案 2 :(得分:0)
基于当前的答案和评论以及您使用Umbraco的事实,我认为QueryString以编码形式提供给您。更好地确保我们得到的是理智和有效的,并以我们可以实际处理它的格式。主要的改进是usimg HttpUtility.Decode
以使查询字符串成形。
private Guid? PetitionGuid
{
get
{
Guid? guid = null;
var raw = Page.Request.QueryString["uid"];
if (!String.IsNullOrEmpty(raw))
{
var decoded = HttpUtility.UrlDecode(raw);
Guid parsed;
if (Guid.TryParse(decoded, out parsed))
{
guid = parsed;
}
else
{
Trace.WriteLine(String.Format(
"illigal uid {0}:{1}", raw,decoded));
}
}
return guid;
}
}