Почему приложение ASP. NET -Core может получить сообщение об ошибке «Блокировка / разблокировка областей файлов на этой платформе не поддерживается». при развертывании на MacOS? - PullRequest
1 голос
/ 04 марта 2020

Наша встроенная библиотека баз данных использует метод FileStream.Lock(long, long) для реализации блокировки. У нас есть клиент, использующий версию нашей библиотеки. NET Standard 2.0 в своем небольшом приложении ASP. NET -Core Razor Page, который сообщает, что его приложение получает PlatformNotSupportedException «Блокировка / разблокировка областей файла не поддерживается в этой платформы. Используйте FileShare для всего файла вместо этого. " при развертывании в MacOS (но не при развертывании в Windows). Я проверил с клиентом, и это на Macbook Pro 2013 года с бесплатной * Cat, установленной Catalina на APFS.

Конечно, блокировка областей файлов не является действительно неподдерживаемой в MacOS - иначе нам должно быть гораздо больше жалоб! Итак, нам интересно, есть ли что-то, что может отсутствовать или быть неправильным в проекте или установке, которая объясняет ошибку и, будем надеяться, будет исправима. Или мы могли бы как-то столкнуться с ограничением в MacOS, которое является более жестким, чем другие платформы? Мы используем некоторые большие специальные значения далеко за пределами большинства файлов (что допустимо и в большинстве случаев работает нормально), но мы уже ограничили их, чтобы они не превышали положительный диапазон Int32 со знаком, поскольку некоторые платформы, по-видимому, отображают long аргументов в int значений.

Кто-нибудь сталкивался с этой ошибкой раньше и решал, что было не так? Или на самом деле нет способа поддержать блокировку области файла для. NET программ на Ma c?

1 Ответ

3 голосов
/ 04 марта 2020

Если вы отметите исходный код , вы увидите, что это явно не поддерживается . Файл с указанием версии c 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 , чтобы узнать, когда этот файл изменился и как.

Комментарий коммита через три года go (февраль 2017 г.) объясняет, почему это было отключено:

OSX не поддерживает использование как fcntl, так и стадо. Поскольку мы уже используем его в FileShare для всего файла, мы не можем включить частичную блокировку файлов, как на других Unix платформах. Альтернатива - бросить PNSE и предложить вместо этого использовать FileShare для всего файла.

...