C# 从X509CertificateStore读取的未处理异常

C# 从X509CertificateStore读取的未处理异常,c#,x509certificate,C#,X509certificate,我正在处理一个非常旧的项目,并将其从on-prem移动到运行windows server 2016的azure VM,在移动之后,我们注意到一个API端点返回坏网关(502)。我用邮递员重新创建了请求,发现我甚至没有得到回复。在添加了一系列日志之后,我将其缩小到下面的方法,假设它从证书中读取安全令牌。 似乎在迭代每个证书的代码之前发生了未处理的异常,但我似乎无法使用UnhandledExceptionEventHandler捕获异常。 据我所知,所有必需的证书都已准备就绪。这里使用的那个我甚至给

我正在处理一个非常旧的项目,并将其从on-prem移动到运行windows server 2016的azure VM,在移动之后,我们注意到一个API端点返回坏网关(502)。我用邮递员重新创建了请求,发现我甚至没有得到回复。在添加了一系列日志之后,我将其缩小到下面的方法,假设它从证书中读取安全令牌。 似乎在迭代每个证书的代码之前发生了未处理的异常,但我似乎无法使用UnhandledExceptionEventHandler捕获异常。 据我所知,所有必需的证书都已准备就绪。这里使用的那个我甚至给了用户组“Everyone”完全访问权限,只是为了消除这一可能的错误原因 实际上,这个方法对每一行代码都充满了日志记录,但为了可读性,我已经删除了它

        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

        }
私有静态X509SecurityToken GetSecurityTokenBySimpleDisplayName(字符串simpleDisplayName)
{
if(string.IsNullOrEmpty(simpleDisplayName))
抛出新ArgumentNullException(“simpleDisplayName”);
尝试
{
AppDomain currentDomain=AppDomain.currentDomain;
currentDomain.UnhandledException+=新的UnhandledExceptionEventHandler(MyHandler);
使用(X509CertificateStore存储=X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore))
{
var isOpen=store.OpenRead();
int certIndex=-1;
/*****这里就是它崩溃的地方*****/
for(int i=0;i
应用程序事件日志显示此错误:

  • 故障应用程序名称:w3wp.exe,版本:10.0.14393.0,时间戳:0x57899b8a
  • 故障模块名称:KERNELBASE.dll,版本:10.0.14393.3383,时间戳:0x5ddcba29
  • 异常代码:0xe0434352
  • 故障偏移量:0x000000000034C48
  • 出错进程id:0x3528
  • 故障应用程序启动时间:0x01d5f20898415d08
  • 出现故障的应用程序路径:c:\windows\system32\inetsrv\w3wp.exe
  • 故障模块路径:C:\windows\System32\KERNELBASE.dll
  • 报告Id:64f16b87-a524-4e0e-9ab9-d8295ce7b29b
  • 故障包全名:
  • 错误包相对应用程序ID:

我怎样才能更好地了解出了什么问题?

找到了答案。应用程序池需要设置为“启用32位应用程序”,一旦设置到位,它就会重新开始工作

您说邮递员不工作。准确吗?大多数时候,我看到像这样的问题,邮递员的工作和c#代码不工作。所以首先让邮递员工作。然后使用像wireshark或fiddler这样的嗅探器,比较工作邮递员和非工作c#之间的第一个请求。c#中的默认标题与postman不同。加密设置最近在4.7版本(可能还有4.6版本)的网络库中发生了变化。很多人在使用工作代码和升级到4.7时遇到问题。我认为这与加密模式从32位变为64位有关。如果Postman不工作,则IP地址有问题。你无法到达网关。嗅探器结果应该显示您正在使用的IP地址(或主机名)。如果您使用的是IP,请更改主机名。如果定期使用DCHP,则会更改机器的IP地址。因此,当启用DCHP时,始终使用主机名而不是IP。我认为邮递员不是问题所在。api端点有一些怪癖,比如当输入特定的出生日期时,它只会返回一条成功消息。当我这样做的时候,我得到了一个我应该得到的响应,但是当我做这个怪癖的时候,我没有进入上面的方法,当我使用真实的数据时,邮递员没有得到响应,日志显示请求在注释处崩溃,这里是崩溃的地方,我们应该猜一下错误是什么?指向代码失败的行是不够的。我同意不是邮递员。但是你需要让邮递员在尝试使用c之前工作。让api与邮递员一起工作会更容易。邮递员您将能够查看回复并使更改更容易。所以,您首先必须使用数据登录到api。然后,您需要与邮递员一起处理返回数据的请求。最后,使用c#执行正在工作的postman查询。