Могу ли я записать файл в папку на сервере из работающего на нем приложения веб-API?

У меня есть этот код в моем приложении веб-API для записи в файл CSV:

private void SaveToCSV(InventoryItem invItem, string dbContext)
{
    string csvHeader = "id,pack_size,description,vendor_id,department,subdepartment,unit_cost,unit_list,open_qty,UPC_code,UPC_pack_size,vendor_item,crv_id";

    int dbContextAsInt = 0;
    int.TryParse(dbContext, out dbContextAsInt);
    string csvFilename = string.Format("Platypus{0}.csv", dbContextAsInt);

    string csv = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}", invItem.ID,
        invItem.pksize, invItem.Description, invItem.vendor_id, invItem.dept, invItem.subdept, invItem.UnitCost,
        invItem.UnitList, invItem.OpenQty, invItem.UPC, invItem.upc_pack_size, invItem.vendor_item, invItem.crv_id);

    string existingContents;
    using (StreamReader sr = new StreamReader(csvFilename))
    {
        existingContents = sr.ReadToEnd();
    }

    using (StreamWriter writetext = File.AppendText(csvFilename))
    {
        if (!existingContents.Contains(csvHeader))
        {
            writetext.WriteLine(csvHeader);
        }
        writetext.WriteLine(csv);
    }
}

На компьютере разработчика файл csv по умолчанию сохраняется в «C:\Program Files (x86)\IIS Express». Что мне нужно сделать, чтобы сохранить файл, например, в папку «Platypi» на сервере — что-то особенное, при подготовке к его окончательному развертыванию на своем рабочем месте? Должен ли я специально устанавливать определенные папки хурмы, чтобы разрешить запись в «Утконос».

Это просто вопрос изменения этой строки:

string csvFilename = string.Format("Platypus{0}.csv", dbContextAsInt);

...к этому:

string csvFilename = string.Format(@"\Platypi\Platypus{0}.csv", dbContextAsInt);

?


person B. Clay Shannon    schedule 07.02.2014    source источник


Ответы (2)


В случае с папкой IIS приложение имеет права на запись туда. Предлагаю записывать файлы в папку App_Data.

Если вы хотите сохранить файлы вне папки приложения IIS, вы должны предоставить служебной учетной записи пула приложений IIS (я думаю, что по умолчанию это NETWORKSERVICE) соответствующие права на эту папку.

По просьбе Б. Клэя Шеннона моя реализация:

string fullSavePath = HttpContext.Current.Server.MapPath(string.Format("~/App_Data/Platypus{0}.csv", dbContextAsInt));
person Patrick Hofman    schedule 07.02.2014
comment
Буду ли я писать в папку AppData через Environment.SpecialFolder.ApplicationData? - person B. Clay Shannon; 08.02.2014
comment
Следующая строка просто возвращает строку ApplicationPath: string pathOfMostResistence = Environment.SpecialFolder.ApplicationData.ToString(); - person B. Clay Shannon; 08.02.2014
comment
Просто используйте Server.MapPath("~/App_Data/..."). Это возвращает папку app_data. ~ означает корневую папку приложения. - person Patrick Hofman; 08.02.2014
comment
Вам нужна дополнительная помощь? - person Patrick Hofman; 10.02.2014
comment
Пытаясь понять, что это вернет, я добавил следующий код: string bla = Server.MapPath(~/App_Data/); ... и сервер не распознан (не удается разрешить символ «сервер») - person B. Clay Shannon; 10.02.2014
comment
Попробуйте HttpContext.Current.Server.MapPath - person Patrick Hofman; 10.02.2014
comment
Я ссылаюсь на System.Web, у меня есть использование System.Web, и даже ожидание HttpServerUtility не выполняется; на самом деле Intellisense показывает только UrlTokenEnclode и UrlTokenDecode как допустимые варианты выбора после HttpServerUtility. - person B. Clay Shannon; 10.02.2014
comment
Используйте не HttpServerUtility, а HttpContext - person Patrick Hofman; 10.02.2014
comment
Хорошо, это работает нормально; добавьте это как ответ, и я отмечу это как таковое. Я собираюсь добавить свой собственный ответ с точным кодом, который я использовал. Или отредактируйте свой существующий ответ, я должен сказать, с этой дополнительной информацией. - person B. Clay Shannon; 10.02.2014
comment
@B.ClayShannon: я взял ваш код и немного обновил его по своему вкусу. - person Patrick Hofman; 11.02.2014

Спасибо Патрику Хофману; это точный код, который я использую, и он сохраняется в папке проекта App_Data:

public static string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");
. . .
string csvFilename = string.Format("Platypus{0}.csv", dbContextAsInt);
string fullSavePath = string.Format("{0}{1}", appDataFolder, csvFilename);
person B. Clay Shannon    schedule 10.02.2014