Локальная отладка функции Azure дает забавный путь к AppDomain.CurrentDomain.BaseDirectory.

Есть ли лучший способ вызвать и получить мои шаблоны электронной почты из файлов html в моем решении?

Я вызываю «AppDomain.CurrentDomain.BaseDirectory» из проекта функции Azure и моего проекта ASP.Net MVC, чтобы получить путь к моим шаблонам электронной почты. (файлы .html)

Но вызов, сделанный из функции Azure, даже не возвращает путь в решении!

Проще говоря, проект функций ASP.Net MVC и Azure вызывает EmailService.cs в другом проекте с именем projectName.Services для создания электронных писем.

Из обоих проектов я вызываю EmailService.cs следующим образом.

_emailService.CancelEventSendHostEmail(value1, someObject, anotherObject, "someMessage");

и в «CancelEventSendHostEmail» я делаю что-то вроде этого

CancelEventSendHostEmail(/*incoming properties*/) {

  var outerTemplateHtml = GetEmailTemplate("email-outer-body-template.html");
  var specificTemplate= GetEmailTemplate("someTemplate.html");
  // do some work to fill in values in the email
  // send the email
}

теперь GetEmailTemplate выглядит так

public StringBuilder GetEmailTemplate(string templateName)
{
    string htmlAsString 
            = File.ReadAllText(Path.Combine(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).ToString()).ToString(), 
            @"Yogabandy2017.Services\EmailingTemplates", templateName));
        return new StringBuilder(htmlAsString);
 }

Теперь это отлично работает с проектом ASP.Net MVC для поиска, получения и чтения в файле шаблона HTML в виде строки. EmailService.cs без проблем находит файл из проекта ASP.Net MVC, но когда я вызываю GetEmailTemaplate из моей функции Azure,

AppDomain.CurrentDomain.BaseDirectory

path возвращает путь, который не находится в каталоге проекта или решения.

Он возвращает путь, который выглядит так

C:\Users\chuckdawit\AppData\Local\AzureFunctionsTools\Releases\1.2.0\cli\

где, как будто я нахожусь в приложении asp.net mvc и читаю в тексте «AppDomain.CurrentDomain.BaseDirectory», возвращает такой путь

C:\Users\chuckdawit\Source\Workspaces\YogaBandy2017\YogaBandy2017\YogaBandy2017\

где я могу затем найти файл шаблона электронной почты html в папке в этом проекте!

введите здесь описание изображения


person user1186050    schedule 14.06.2018    source источник


Ответы (2)


Существует API для получения текущей папки функции:

public static HttpResponseMessage Run(HttpRequestMessage req, ExecutionContext context)
{
    var message = $"You are in {context.FunctionDirectory}";
    return req.CreateResponse(System.Net.HttpStatusCode.OK, message );
}

См. документацию. :

FunctionDirectory: предоставляет текущий каталог функций (например, при работе в Azure, d:\home\site\wwwroot\HttpTrigger1).

Обратите внимание, что локально это будет внутри bin\debug. Будьте осторожны, чтобы спланировать, как вы будете развертывать шаблоны электронной почты относительно папки функций.

Разумной альтернативой является развертывание шаблонов в хранилище BLOB-объектов, а затем использование входных привязок для загрузки их в функцию без необходимости кода.

person Mikhail Shilkov    schedule 14.06.2018
comment
но будет ли это работать так же, как только я опубликую его в Azure, и он запустится в «облаке»!? вот что мне на самом деле нужно сделать. Path.GetFullPath(Path.Combine(context.FunctionDirectory, @..\..\..\..\..\)); это приводит меня к следующей папке, где находятся мои шаблоны электронной почты - person user1186050; 14.06.2018
comment
@ user1186050 В Azure будут развернуты только двоичные файлы, структура решения C# не сохранится, поэтому вам нужно скопировать шаблоны в папку bin как часть сборки, а не ..\..\.. обман. - person Mikhail Shilkov; 14.06.2018
comment
какая папка bin? Я вижу 'projectName\bin\Debug\net462\bin'. Я предполагаю, что когда я публикую в режиме выпуска, я увижу, что Debug заменен на Release? Так что мне копировать в папку проекта/bin или дальше по пути к файлу после папки net462/bin? - person user1186050; 14.06.2018
comment
@user1186050 user1186050 Просто отметьте файлы как Content и Copy to Output Directory в свойствах файла, Visual Studio сделает это за вас. - person Mikhail Shilkov; 14.06.2018
comment
хорошо, спасибо! это мне очень помогает! Должен ли я сделать то же самое для своего проекта ASP.Net MVC или только для функции Azure? - person user1186050; 14.06.2018

Чтобы получить текущую папку функции, мы можем сделать следующее:

string currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

Скриншот результата:

введите здесь описание изображения

person Lee Liu    schedule 14.06.2018
comment
Это работает для приложений-функций и служб приложений. - person Jake Smith; 19.01.2021