为啥 ASP.NET-Core 应用程序会收到错误消息“此平台不支持锁定/解锁文件区域”。在 MacOS 上部署时?
Posted
技术标签:
【中文标题】为啥 ASP.NET-Core 应用程序会收到错误消息“此平台不支持锁定/解锁文件区域”。在 MacOS 上部署时?【英文标题】:Why could an ASP.NET-Core app get the error message "Locking/unlocking file regions is not supported on this platform." when deployed on MacOS?为什么 ASP.NET-Core 应用程序会收到错误消息“此平台不支持锁定/解锁文件区域”。在 MacOS 上部署时? 【发布时间】:2020-06-16 09:41:05 【问题描述】:我们的嵌入式数据库库使用FileStream.Lock(long, long)
方法来实现锁定。我们有一个客户在他们的小型 ASP.NET-Core Razor Page 应用程序中使用我们库的 .NET Standard 2.0 版本,他报告说他们的应用程序正在获取 PlatformNotSupportedException“此平台不支持锁定/解锁文件区域。使用 FileShare on而是整个文件。”在 MacOS 上部署时(但不是在 Windows 上部署时)。我与客户核实,它在 2013 Macbook Pro 上,在 APFS 上安装了最新的 Catalina。
当然,锁定文件区域在 MacOS 上并非真正不受支持——否则我们应该会收到更多投诉!因此,我们想知道项目或安装中是否存在可以解释错误并希望可以纠正的东西。或者我们是否会以某种方式在 MacOS 中遇到比其他平台更严格的限制?我们确实在大多数文件的末尾使用了一些大的特殊值(这是合法的并且在大多数情况下都可以正常工作),但我们已经将这些值限制为不超过签名 Int32
的正范围,因为某些平台显然映射了 @ 987654324@ 参数转换为int
值。
以前有没有人遇到过这个错误并解决了问题?还是真的没有办法在 Mac 上支持 .NET 程序的文件区域锁定?
【问题讨论】:
想要使用 DB 吗?它在什么 macOS FS 上运行? 他们正在使用我们的 VistaDB 嵌入式数据库引擎。 Mac 文件系统有多种风格,我不认为它们的行为与 Windows 的低级操作相同 @Jason,所以他们部署的特定文件系统可能是真正的问题? 我会这么认为。这也可能是他们启用的一些安全设置。这不是我的专业领域,但这似乎是合理的。另见:github.com/mbdavid/LiteDB/issues/787 【参考方案1】:如果您检查the source code,您会发现这是明确不支持。特定版本的 FileStream.OSX.cs
文件显式抛出:
public partial class FileStream : Stream
private void LockInternal(long position, long length)
throw new PlatformNotSupportedException(SR.PlatformNotSupported_OSXFileLocking);
private void UnlockInternal(long position, long length)
throw new PlatformNotSupportedException(SR.PlatformNotSupported_OSXFileLocking);
GitHub 的好处是您可以使用blame 了解该文件何时更改以及如何更改。
三年前(2017 年 2 月)commit comment 解释了为什么关闭此功能:
OSX 不支持同时使用 fcntl 和flock。因为我们已经在 FileShare 中为整个文件使用了一个,所以我们不能像在其他 Unix 平台上那样启用部分文件锁定。另一种方法是抛出 PNSE 并建议在整个文件上使用 FileShare。
【讨论】:
感谢您挖掘它!如果 MacOS 通常禁用它,那么我想我们将不得不调整我们在特定运行时处理它的方式。幸运的是,我们刚刚添加了一个使用内存锁定的单进程模式,因此我们离替代解决方案不远了。以上是关于为啥 ASP.NET-Core 应用程序会收到错误消息“此平台不支持锁定/解锁文件区域”。在 MacOS 上部署时?的主要内容,如果未能解决你的问题,请参考以下文章
获取 ASP.NET-Core 2.2 控制器中的控制器名称和方法名称
Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序
从类库访问 Asp.net-core 中的 appsetting.json
我可以通过使用 cookie 自动重新登录到我的 SignInManager 和 UserManager (Identity) -> Asp.Net-Core Identity (Deploye