Asp.net 为什么我的用户无法验证他们的电子邮件地址?
我正在使用唯一标识符验证ASP.NET应用程序中用户的电子邮件地址。当我尝试使用uniqueidentifier验证任何电子邮件地址时,我可以毫无问题地进行验证。然而,我80%的用户无法做到这一点。我搞不懂为什么会这样!我已经有用户直接给我发电子邮件,转发他们的激活电子邮件,我可以激活他们的帐户而不出问题 下面是电子邮件中验证链接的示例 mysite.org/application.aspx?uid=0fcc9582-386c-4738-943d-36e09c8df4bd 以下是正在发生的例外情况:Asp.net 为什么我的用户无法验证他们的电子邮件地址?,asp.net,sql-server,email,uniqueidentifier,Asp.net,Sql Server,Email,Uniqueidentifier,我正在使用唯一标识符验证ASP.NET应用程序中用户的电子邮件地址。当我尝试使用uniqueidentifier验证任何电子邮件地址时,我可以毫无问题地进行验证。然而,我80%的用户无法做到这一点。我搞不懂为什么会这样!我已经有用户直接给我发电子邮件,转发他们的激活电子邮件,我可以激活他们的帐户而不出问题 下面是电子邮件中验证链接的示例 mysite.org/application.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)
更新:下面是我的PremistGuid属性的get方法
private Guid? PetitionGuid
{
get
{
if (Page.Request.QueryString["uid"] == null)
return null;
else
return new Guid( Page.Request.QueryString["uid"].ToString());
}
}
这里有什么明显的我遗漏的吗
请随时提出您可能需要提出的任何问题。Guid应包含32位数字和4个破折号xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxx
tihs 0fcc9582-386c-4738-943d-36e09c8df4b是否符合要求?你在最后一部分丢失了一个数字。您的数字是11位,而不是12位。您缺少一个字符
0fcc9582-386c-4738-943d-36e09c8df4b <---
12345678 1234 1234 1234 123456789012
因此,基本上,如果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);
根据当前的答案和评论以及您使用Umbraco I supect的事实,查询字符串将以编码形式发送给您。最好确保我们得到的信息是合理有效的,并且符合我们实际能够处理的格式。主要的改进是在usimg中使querystring成形
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;
}
}
您正在将url参数字符串转换为guid吗?您首先是如何生成guid值的?@kad1r是的,我正在从字符串转换为guid。我已使用Guid属性的访问器方法更新了该问题@我正在使用GUID.NewGuid方法生成GUID。这看起来很好,但实际上并不是问题所在。粘贴时我错过了最后一个字符。我现在已经更新了这个问题。你得到这个特定错误的唯一方法是如果你没有传递有效的guid,那么要么guid的字符长度错误,要么删除了破折号,要么插入了非十六进制字符,要么附加了其他垃圾,要么你的用户正在复制粘贴URL,而自己缺少字符。。。YMMHey Eoin,谢谢你的洞察力。那么,也许使用guid以外的东西会更好?也许是guid的一个短散列?我不认为是这样。。。Guid自己也很好。。。我会根据上面我的tryparse建议稍微修改一下你的代码,如果你不能解析它们,给用户一个解释性更强的错误,而不是stacktrace。这实际上不是问题所在。粘贴时我错过了最后一个字符。我现在更新了这个问题。
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;
}
}