Файл конфигурации службы Windows C#

Я написал эту небольшую функцию несколько лет назад:

function sqlvprintf($query, $args)
{
    global $DB_LINK;
    $ctr = 0;
    ensureConnection(); // Connect to database if not connected already.
    $values = array();
    foreach ($args as $value)
    {
        if (is_string($value))
        {
            $value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
        }
        else if (is_null($value))
        {
            $value = 'NULL';
        }
        else if (!is_int($value) && !is_float($value))
        {
            die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
        }
        $values[] = $value;
        $ctr++;
    }
    $query = preg_replace_callback(
        '/{(\\d+)}/', 
        function($match) use ($values)
        {
            if (isset($values[$match[1]]))
            {
                return $values[$match[1]];
            }
            else
            {
                return $match[0];
            }
        },
        $query
    );
    return $query;
}

function runEscapedQuery($preparedQuery /*, ...*/)
{
    $params = array_slice(func_get_args(), 1);
    $results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.   
    return $results;
}

Это позволяет запускать операторы в однострочном C # -ish String.Format, например:

runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);

Он избегает использования типа переменной. Если вы попытаетесь параметризовать имена таблиц и столбцов, это будет терпеть неудачу, поскольку она помещает каждую строку в кавычки, которая является недопустимым синтаксисом.

ОБНОВЛЕНИЕ БЕЗОПАСНОСТИ: предыдущая версия str_replace разрешала инъекции, добавляя токены {#} в пользовательские данные. Эта версия preg_replace_callback не вызывает проблем, если замена содержит эти токены.

28
задан ДМИТРИЙ МАЛИКОВ 23 August 2013 в 14:02
поделиться

6 ответов

Я определил местоположение ошибки, и она была связана с полномочиями файла. После установки сервиса моя учетная запись локального пользователя не имела доступа для изменения app.exe.config файла.

инструмент, который я использовал для редактирования, не сообщал мне, что это запрещалось доступа, чтобы сохранить файл - это - блокнот ++, если кому-либо интересно - таким образом, я не мог видеть, что это не сохраняло по старому файлу конфигурации.

Решенный теперь, спасибо все.

Martin.

28
ответ дан 28 November 2019 в 03:34
поделиться

Когда Вы находитесь в режиме отладки, проверяют и видят, какие настройки находятся в my_exe_file_name.vshost.exe.config, Также удостоверяются, что Вы корректируете это в app.config файле. Visual Studio должна обновить заключительный файл конфигурации в Вашем мусорном ведре/папках отладки.

4
ответ дан Aaron Fischer 28 November 2019 в 03:34
поделиться

Возможно, вы обновляете неправильный файл конфигурации. Вы должны дважды проверить это, используя

System.Configuration.ConfigurationManager.OpenExeConfiguration(PATH_TO_CONFIG);
3
ответ дан Igor Zelaya 28 November 2019 в 03:34
поделиться

Обычно для Windows Services, который я пишу, я бросаю appName.exe.config файл в C:\WINDOWS\system32\

, Возможно, у Вас есть более старая версия в том каталоге, который является, где Ваш сервис получает значение, даже при том, что Вы обновили файл конфигурации в своем проекте.

2
ответ дан Dave Baghdanov 28 November 2019 в 03:34
поделиться

Файл App.config должен быть переименован к your_exe_file_name.exe.config и помещен около EXE-файла.

1
ответ дан Alex Reitbort 28 November 2019 в 03:34
поделиться

Действительно ли возможно, что у Вас есть больше чем один экземпляр определенной записи RuntimeFrequency? ConfigurationManager читает файл сверху донизу и обрабатывает каждую установку индивидуально. Поэтому последнее значение RuntimeFrequency, который определяется в файле, является тем, которое это будет использовать.

, Если Вы хотите знать наверняка, если бы Ваш файл используется, я просто удалил бы или прокомментировал бы любое определение для RuntimeFrequency (скопировать/вставить, ошибки действительно происходят), и ожидайте для наблюдения ошибки приложения, когда ConfigurationManager пытается сослаться на запись в AppSettings, который не существует.

1
ответ дан EnocNRoll - Ananda Gopal 28 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: