Атрибут CallerFilePathAttribute не возвращает путь к файлу с допустимыми разделителями каталогов в службе приложений Linux-контейнера Azure. - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий метод в веб-приложении netcore2.1:

public static void Information(string message, [CallerFilePath] string filePath = "")
{
    var fileNameWithoutExtn = Path.GetFileNameWithoutExtension(filePath);
    . . .
}

При работе в службе приложений Azure (хост Windows) он ведет себя как ожидалось:

filePath= C: \ web \ src \ production \ MyWebsite \ Controllers \ ChallengeController.cs

fileNameWithoutExtn = ChallengeController



Но, когда я запускаю это на linux Azure, Linuxслужба приложения контейнера:

filePath = C: \ web \ src \ production \ MyWebsite \ Controllers \ ChallengeController.cs

fileNameWithoutExtn = C: \ web \ src \ production \ MyWebsite \Controllers \ ChallengeController

И

Path.DirectorySeparatorChar = /

Path.AltDirectorySeparatorChar = /

Path.PathSeparator =:

Path.VolumeSeparatorChar = /

Почему CallerFilePath дает мне путь, который не совпадает с DirectorySeparatorChar или AltDirectorySeparatorChar?

PS: я выложил то же самое в форум MSDN но не GeT любой ответ, следовательно, размещение здесь.Я буду обновлять здесь, если я слышу там.

1 Ответ

0 голосов
/ 26 ноября 2018

Это потому, что:

a) Linux использует '\' в качестве разделителя каталогов, в то время как Windows использует '/'
b) CallerFilePath возвращает путь во время компиляции.Код был скомпилирован в Windows, а не в Linux.

Итак, вы получите filePath = C:\web\src\production\MyWebsite\Controllers\ChallengeController.cs

Обходной путь для этого - написать свой собственный метод для получения имени файла, например:

    static void Main(string[] args)
    {
        char DirectorySeparatorChar='\\';

        string path = @"C:\web\src\production\MyWebsite\Controllers\ChallengeController.cs";

        string fileName = GetFileNameWithoutExtension(path, DirectorySeparatorChar);

    }

    public static String GetFileName(String path,char DirectorySeparatorChar)
    {
        if (path != null)
        {
            int length = path.Length;
            for (int i = length; --i >= 0;)
            {
                char ch = path[i];
                if (ch == DirectorySeparatorChar )
                    return path.Substring(i + 1, length - i - 1);

            }
        }
        return path;
    }

    public static String GetFileNameWithoutExtension(String path, char DirectorySeparatorChar)
    {
        path = GetFileName(path, DirectorySeparatorChar);
        if (path != null)
        {
            int i;
            if ((i = path.LastIndexOf('.')) == -1)
                return path; 
            else
                return path.Substring(0, i);
        }
        return null;
    }`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...