1

我正在将我们的 .net core(2.1) API 从 IIS 移动到 GCP 中 kubernetes 中的 linux 容器,并且当文件名包含非 ASCII 字符时,从挂载的文件服务器中检索文件时遇到了一些问题。与此 GitHub issue类似,但这些是标准 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 文件存储中,并使用 PersistentVolume 和 PersistentVolumeClaim 安装到 kubernetes 集群,然后安装到容器中。

运行此方法时,我尝试更改当前线程文化,但没有运气。相同的代码在使用符号链接指向文件共享的 windows/IIS 版本上运行良好。

如果我直接使用 new 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,而在于 pod 上安装的驱动器。使用 ls 可以正确显示本地文件,但挂载上的文件不是。所以它似乎与驱动器的安装方式有关。我有一个persistantvolume.yaml

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

和一个持久的volumeclaim

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 读取这些文件

4

0 回答 0