Имена файлов, отличных от ASCII, на постоянном томе GCP отображаются неправильно

Я перемещаю наш API ядра.net (2.1) из IIS в контейнеры linux в kubernetes в GCP, и у меня возникают проблемы с извлечением файлов с подключенного файлового сервера, когда имена файлов содержат символы, отличные от ASCII. Подобно этой проблеме GitHub, но это стандартные символы UTF8. åäö

var di = new DirectoryInfo(directory);
if (di.Exists)
{
    var dFiles = di.GetFiles("*.pdf", SearchOption.TopDirectoryOnly);
    Log.Information($"Files found in {di.Name} : {string.Join(",", dFiles.Select(f => f.Name))}");
    //Log.Information($"Length of files found in {di.Name} : {string.Join(",", dFiles.Select(f => f.Length))}");
    files.AddRange(dFiles);
}

bost�der.pdf возвращается, но это должно быть bostäder.pdf.

Во всех остальных случаях символы обрабатываются правильно, например, при чтении из базы данных. Проблема возникает только при чтении имен файлов. Я получаюFileNotFoundExceptionпри попытке прочитать длину этих файлов. LastWriteTime возвращает 1601-01-01.

Файл находится в хранилище файлов GCP и подключается к кластеру kubernetes с использованием PersistentVolume и PersistentVolumeClaim, а затем подключается к контейнерам.

Я попытался изменить культуру currentthread при запуске этого метода, но безуспешно. Тот же код отлично работает в версии Windows/IIS, используя символические ссылки для указания на общий доступ к файлам.

Если я укажу путь к файлу напрямую, используя новый FileInfo, а не DirectoryInfo.GetFiles то результирующий объект FileInfo возвращает правильно закодированное имя файла, хотя FileInfo.Length метод по-прежнему вызывает FileNotFoundException.

Использовали несколько образов Docker

  • mcr.microsoft.com/dotnet/core/aspnet:2.1-bionic
  • mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim

Также пытались установить

ENV LC_ALL=sv_SE.UTF-8 \
    LANG=sv_SE.UTF-8

в Dockerfile безуспешно. Есть идеи, что еще я могу попробовать?

Редактировать:

Я исследовал дальше, и проблема не в.net, а в смонтированном диске на стручках. Локальные файлы отображаются правильно с использованием ls, а файлы на монтировании - нет. Похоже, это как-то связано со способом установки диска. У меня есть persistantvolume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: fileserver
spec:
  capacity:
    storage: 1T
  accessModes:
  - ReadWriteMany
  nfs:
    path: /mymount
    server: 1.2.3.4

и постоянный объем претензии

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fileserver-claim
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 1T

который установлен на мои поды с помощью

volumeMounts:
          - mountPath: /mnt/fileserver
            name: pvc

а также

volumes:
      - name: pvc
        persistentVolumeClaim:
          claimName: fileserver-claim
          readOnly: false

в моем deployment.yaml

Изменить 2:

Кажется, проблема с Cloud Filestore, поддерживающим только NFSv3 - есть ли способ прочитать эти файлы с помощью NFSv3

0 ответов

Другие вопросы по тегам