【发布时间】:2020-06-16 19:47:44
【问题描述】:
我正在处理一个非常古老的项目,并将其从本地迁移到运行 Windows Server 2016 的 azure VM,迁移后我们注意到 API 端点返回错误网关 (502)。我使用邮递员重新创建了请求,并注意到我什至没有得到回复。添加一堆日志记录后,我将其缩小到下面的方法,它假设从证书中读取安全令牌。 似乎在迭代每个证书的代码之前发生了未处理的异常,但我似乎无法使用 UnhandledExceptionEventHandler 捕获异常。 据我所知,所有必需的证书都已到位。这里使用的我什至给用户组“每个人”完全访问权限只是为了消除它作为错误的可能原因 实际上,此方法对每一行代码都充满了日志记录,但为了便于阅读,我已将其删除。
private static X509SecurityToken GetSecurityTokenBySimpleDisplayName(string simpleDisplayName)
{
if (string.IsNullOrEmpty(simpleDisplayName))
throw new ArgumentNullException("simpleDisplayName");
try
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
using (X509CertificateStore store = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore))
{
var isOpen = store.OpenRead();
int certIndex = -1;
/***** HERE IS WHERE IT CRASHES *****/
for (int i = 0; i < store.Certificates.Count; i++)
{
if (store.Certificates[i].SimpleDisplayName.ToLower().Equals(simpleDisplayName.ToLower()))
certIndex = i;
}
if (certIndex < 0)
{
throw new SecurityException("Certificate " + simpleDisplayName + " not found");
}
var token = new X509SecurityToken(store.Certificates[certIndex]);
return token;
}
}
catch(Exception ex)
{
// Logging exception
return null;
}
}
public static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
// Logging exception
}
应用程序事件日志给出了这个错误:
- 错误应用程序名称:w3wp.exe,版本:10.0.14393.0,时间戳:0x57899b8a
- 故障模块名称:KERNELBASE.dll,版本:10.0.14393.3383,时间戳:0x5ddcba29
- 异常代码:0xe0434352
- 故障偏移:0x0000000000034c48
- 故障进程ID:0x3528
- 错误应用程序启动时间:0x01d5f20898415d08
- 错误的应用程序路径:c:\windows\system32\inetsrv\w3wp.exe
- 错误模块路径:C:\windows\System32\KERNELBASE.dll
- 报告 ID:64f16b87-a524-4e0e-9ab9-d8295ce7b29b
- 故障包全名:
- 错误的包相关应用程序 ID:
我怎样才能更好地了解问题所在?
【问题讨论】:
-
你说邮递员不工作。那准确吗?大多数时候,我看到像 Postman 这样的问题可以工作,而 c# 代码不起作用。所以首先让邮递员工作。然后使用像wireshark或fiddler这样的嗅探器并比较工作邮递员和非工作c#之间的第一个请求。 c# 中的默认标头与邮递员不同。加密设置似乎最近在 4.7(可能是 4.6)的网络库中发生了变化。很多人在获取工作代码和升级到 4.7 时遇到问题。我认为这与从 32 位到 64 位的加密模式有关。
-
如果 Postman 不能正常工作,说明 IP 地址有问题。您无法到达 GATEWAY。嗅探器结果应显示您正在使用的 IP 地址(或主机名)。如果您使用的是 IP,请更改主机名。如果定期使用 DCHP,则机器的 IP 地址会更改。因此,当启用 DCHP 时,请始终使用主机名而不是 IP。
-
我不认为邮递员是问题所在。 api 端点有一些怪癖,比如当输入特定的出生日期时,它只会返回一条成功消息。当我这样做时,我得到了应有的响应,但是在执行此怪癖时,我不会进入上述方法,而是使用真实数据时,邮递员没有得到响应,并且日志记录显示请求在评论 /***** 这里是它崩溃的地方 *****/
-
我们应该猜猜错误是什么?指向代码失败的行是不够的。记录引发的异常呢?
-
我同意这不是 Postman。但是在尝试使用 c# 之前,您需要让邮递员工作。让 api 与邮递员一起工作会更容易。邮递员您将能够查看响应并使更改更容易。因此,您首先必须使用数据登录 api。然后您需要与邮递员一起处理返回数据的请求。最后获取工作邮递员查询并使用 c# 运行。
标签: c# x509certificate