Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为什么我的用户无法验证他们的电子邮件地址?_Asp.net_Sql Server_Email_Uniqueidentifier - Fatal编程技术网

Asp.net 为什么我的用户无法验证他们的电子邮件地址?

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 以下是正在发生的例外情

我正在使用唯一标识符验证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;
    }
}