RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 732689
Accepted
Dmytro
Dmytro
Asked:2020-10-18 22:56:12 +0000 UTC2020-10-18 22:56:12 +0000 UTC 2020-10-18 22:56:12 +0000 UTC

C# ASP.NET 缓存证书文件在生成 pkpass 格式票证时读取它们

  • 772

大家好。

背景:

我正在开发一个 ASP.NET Web 应用程序项目。门票通过网络应用程序出售,当然,门票可以 PDF 和 pkpass 格式获得。在生成 pkpass 票证时,您需要在票证上附加一个密钥和一个证书(这是 2 个文件)并将其发送给 Apple 进行验证。实际上,NuGet 库就是这样做的。 这是我遇到的问题:

描述原因需要很长时间,但归根结底是我们不得不切换到PassSharp库,因此我们重写了整个请求代码。使用新库时,网站负载很重,一些 pkpass 停止验证(每天 0 到 10 件 +/-),并且它们无法在苹果设备上打开。原因:一天几次,2个用户在同一秒内完成支付,第二个线程无法访问文件。我们得到一个 IOException。代码示例:

    Набрали объект pass (не важно для задачи), далее:
    using (var myStream = new MemoryStream())
        {
        string fileNamePK = String.Format(часть алгоритма генерации имени+ @"{0}.pkpass", часть алгоритма генерации имени; //не спрашивайте
//Проблема вот здесь:
        byte[] appleCert = File.ReadAllBytes(currDir + "//" + appleCert);
        byte[] appleCertKey = File.ReadAllBytes(currDir + "//" + appleKey);

        PassWriter.WriteToStream(pass, myStream,
                new X509Certificate2(appleCert),
                new X509Certificate2(appleCertKey,appleCertPass,  X509KeyStorageFlags.Exportable));
        FileStream file = new FileStream(FileNamePath + "\\" + fileNamePK, FileMode.CreateNew, FileAccess.Write);
        myStream.WriteTo(file);
        file.Close();
        myStream.Close();
        ResultListPass += fileNamePK + ";";
        }

而且发生这种情况的可能性似乎很小......

我发现的所有示例都建议执行以下操作:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader fsr = new StreamReader(fs);
byteArrey = fsr.CurrentEncoding.GetBytes(fsr.ReadToEnd());

但是 X509Certificate2 接受一个字节数组,并且类似的方法旨在读取文本信息,无论我如何尝试绕过它(例如,像这样:CurrentEncoding.GetBytes) - 没有结果。此类操作后的字节数组不正确。为了在 byteArrey 之后检查,我什至添加了行 var test = File.ReadAllBytes(filePath); - 字节数组不同。理想的选择是在应用程序级别缓存这些文件并从内存中获取它们,但我不知道该怎么做......显然,这需要在 IIS 级别完成,但同样 - 我不知道不知道怎么做。如果我弄清楚了 - 如何访问它们?请帮助任何可以...

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Viktor Zimin
    2020-10-20T12:21:07Z2020-10-20T12:21:07Z

    如果文件很小,则可以使用 InMemoryCache。

    byte[] 
        appleCert,
        appleCertKey;
    
    MemoryCache cache = MemoryCache.Default;
    DateTime cacheExpiration = DateTime.Now.AddMinutes(20);
    
    string 
        appleCertCacheKey = "appleCert",
        appleCertKeyCacheKey = "appleCertKey";
    
    if (cache.Contains(appleCertCacheKey) && cache.Contains(appleCertKeyCacheKey))
    {
        appleCert = cache.Get(appleCertCacheKey) as byte[];
        appleCertKey = cache.Get(appleCertKeyCacheKey) as byte[];
    }
    else
    {
        appleCert = File.ReadAllBytes(currDir + "//" + appleCert);
        appleCertKey = File.ReadAllBytes(currDir + "//" + appleKey);
    
        cache.Add(appleCertCacheKey, appleCert, cacheExpiration);
        cache.Add(appleCertKeyCacheKey, appleCertKey, cacheExpiration);
    }
    
    • 0
  2. Дмитрий Чистик
    2020-10-20T12:57:05Z2020-10-20T12:57:05Z

    尝试对代码的有问题的部分使用锁定

    static object globalObject = new Object();
    ...
    lock (globalObject)
    { /*тут открытие и чтение из файла*/ }
    

    或读取字节并将它们缓存到静态变量中(如果它们不更改)。

    • 0
  3. Best Answer
    Dmytro
    2020-07-02T23:52:13Z2020-07-02T23:52:13Z

    在使用PassSharp库一段时间并尝试了各种选项(包括上面列出的选项)之后,我们得出的结论是问题不在于实现,而在于库本身,因为无论我采取何种行动,症状都会持续存在。显然它不适合这种加载的应用程序。

    接下来 - 我回到dotnet-passbook 库并试图找出它停止工作的原因。经过相当详细的分析,我发现安装的库缺少库的 GitHub 存储库中的一些方法。由于重新安装库并没有解决问题,我使用来自 GitHub 的代码在我们的应用程序中重新定义了 PassGenerator 和 PassGeneratorRequest 类,这要归功于该解决方案至今仍然有效。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5