gpt4 book ai didi

.net - IIS7 下奇怪的 64/32 位 GUID 问题

转载 作者:行者123 更新时间:2023-12-04 02:28:41 24 4
gpt4 key购买 nike

我的一个团队最近在矩阵中遇到了一个有趣的故障。如果有人可以帮助解释这一点,那就太好了。解释起来可能很复杂,所以请耐心等待。

我们正在构建一个 ASP.Net 应用程序。其中我们有一个简单的“if”语句。

Guid adminId = Guid.Empty;
if (mRoles.Contains("Admin"))
{
adminId = mUserId;
}

(其中 mRoles 是一个列表并包含“管理员”)

这正如预期的那样工作(即 adminID 被分配了 mUserId)。但是,当重写为使用下面的三元运算符时,它不会! (adminID 被分配 Guid 空)!
Guid adminId = mRoles.Contains("Admin") ? mUserId : Guid.Empty;

发现此问题的开发人员在 64 位计算机(IIS7/64 位 vista)上,如果他按如下方式更改 IIS 中的设置...
在“默认应用程序池”>“高级设置”下,选中“启用 32 位应用程序”。现在这两个语句都有效!

我们认为这可能与 Guid 是一个结构而不是一个类的事实有关,并且该值在 64 位进程下以某种方式被偏移。

我怀疑问题与此类似...
http://www.mail-archive.com/comtypes-users@lists.sourceforge.net/msg00164.html
这可以解释为什么第一个简单的 if 语句有效。 (因为创建 adminId 变量可能是创建一个指针,而三元运算符不是?)

如果有人能对此有所了解,那就太好了。
是兼容性问题吗?或者我们对结合三元运算符和结构的误解?

谢谢。

更新

把一个简单的应用程序放在一起,不能在一个全新的项目上重现它,所以必须是 GUID 以外的东西。

//有效(将 mUserId 分配给 adminId)
Guid adminId = true ? mUserId : Guid.Empty;

//不工作(即使 t == true !!!!???)
bool t = (mRoles.Contains("TenantAdmin");
Guid adminId = t ? mUserId : Guid.Empty;

我想我们会回到这个问题的绘图板上。感谢大家的帮助,如果我们得到进一步的帮助,我会再次回到这里。

唯一可能不太清楚的是 mRoles 不是类型字符串的通用列表。它是一个 string[] 并且 Contains() 方法是 LINQs 扩展方法(如果这有什么区别的话),但不明白为什么:-?

更新 2

我们查看了 IL,它是正确的(现在间歇性地工作!)我们发现,当默认应用程序池加载更多应用程序时,它再次开始失败。我们唯一能想到的另一件事是这些其他应用程序中的一些可能包含一些以某种方式干扰我们的应用程序的非托管代码,这可能吗?

最佳答案

如果您还没有这样做,请尝试在您的三元运算符周围使用括号。

我们有一个类似的问题,其中像你这样的代码:

Guid adminId = t ? mUserId : Guid.Empty;

以错误的顺序编译:
(Guid adminId = t) ? mUserId : Guid.Empty;

添加括号以指定顺序修复它:
Guid adminId = (t ? mUserId : Guid.Empty);

我通过使用 .NET Reflector 查看编译后的代码来弄清楚它在做什么。

关于.net - IIS7 下奇怪的 64/32 位 GUID 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1339913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com