Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Открыть новую тему     Написать ответ в эту тему

mxm1975



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ЧЯДНТ (что я делаю не так)?

 
https://stackoverflow.com/questions/2441290/net-json-serialization-of-enum-as-string

Всего записей: 279 | Зарегистр. 31-07-2002 | Отправлено: 23:41 30-08-2018
Kyplon



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mxm1975 Спасибо за наводку!
Вопрос решен буквально одной строкой в Startup.cs, в ConfigureServices нужно добавить

Код:
services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });

Результат: JSON со значением "dog"
Что и требуется =)

Всего записей: 217 | Зарегистр. 14-09-2007 | Отправлено: 12:11 31-08-2018 | Исправлено: Kyplon, 12:12 31-08-2018
RemComm



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую.
 
Как выполнять имперсонацию пользователей в процессе, запущенном он обыного (без админ привилегий) пользователя?
 
Поясню.
 
Есть простой WCF сервис на NetTcpBinding с
 
SecurityMode.TransportWithMessageCredential и ClientCredentialType = MessageCredentialType.Windows
 
 
Контракт сервиса:

Код:
[ServiceContract]
public interface ISvc
{
  [OperationContract]
  int TestMethod1(int i);
}

 
Реализация:

Код:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Svc : ISvc
{
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public virtual int TestMethod1(int i)
{
    SqlConnectionStringBuilder sqlcb = null;
    sqlcb = new SqlConnectionStringBuilder()
    {
      DataSource = "(local)",
      IntegratedSecurity = true,
    };
    using (SqlConnection sqlc = new SqlConnection(sqlcb.ConnectionString))
    {
      sqlc.Open();
 
      // get data from SQL
 
      sqlc.Close();
    }
    return i + 1;
  }
}

 
При обращении к методу службы - оная падает с исключением:
 
Can not load file or assembly System.Data.dll .... Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542)
 
И при императивной имперсонации - та же беда:
 
Реализация:

Код:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Svc : ISvc
{
[OperationBehavior(Impersonation = ImpersonationOption.NotAllowed)]
public virtual int TestMethod1(int i)
{
    using (WindowsImpersonationContext ctx = CurrentPrincipal.Identity.Impersonate())
    {
        SqlConnectionStringBuilder sqlcb = null;
        sqlcb = new SqlConnectionStringBuilder()
        {
            DataSource = "(local)",
            IntegratedSecurity = true,
        };
        using (SqlConnection sqlc = new SqlConnection(sqlcb.ConnectionString))
        {
            sqlc.Open();
 
            // get data from SQL
 
            sqlc.Close();
        }
    }
    return i + 1;
  }
}

 
То же исключение выбрасывается при открытии соединения.
 
Согласно интернету, ошибка 0x80070542 - это BAD IMPERSONATION. Однако дальнейшее гугление не привело к понимаю природы такого поведения. Тип привязки не важен - воспроизводится на всех допустимых привязках. При запуске с админ привилегиями - все работает.
 
Как пролечить?

Всего записей: 838 | Зарегистр. 30-09-2003 | Отправлено: 16:53 11-10-2018 | Исправлено: RemComm, 17:27 11-10-2018
RemComm



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашел причину. Теперь код работает как ожидается. Извините за беспокойство.

Всего записей: 838 | Зарегистр. 30-09-2003 | Отправлено: 18:11 13-10-2018
4seasons



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется рабочая программа и программа обновлений рабочей программы (обе написаны на vb.net).
Мне нужно реализовать механизм обновлений своих программ по принципу обновлений самой студии, когда из студии запускается программа обновлений, а после обновления студии из программы обновлений запускается уже обновленная студия.
 
Вопрос:
Как из рабочей программы запустить программу обновлений так, чтобы та после этого смогла заменить рабочую программу на другую версию?
Иначе говоря, как запустить процесс №2 из процесса №1 так, чтобы процесс №2 не был дочерним процессом программы №1?

Всего записей: 5509 | Зарегистр. 31-05-2009 | Отправлено: 18:14 15-10-2018 | Исправлено: 4seasons, 13:27 16-10-2018
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
4seasons
https://www.experts-exchange.com/questions/27399793/Killing-parent-process-without-closing-child-process.html
https://www.google.com/search?hl=en&q=c%23+create+detached+process&sa=X&ved=0ahUKEwi6uY-O34neAhUDx58KHUBeBU0Q1QIImgEoAA

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 03:56 16-10-2018 | Исправлено: dneprcomp, 03:57 16-10-2018
4seasons



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Спасибо за ссылки, но оказалось, что я и так все сделал правильно и ничего нового в них не оказалось.
 
Оказывается запуск процесса через
Код:
Process.Start("notepad.exe")
Process.GetCurrentProcess.Kill()  

или через
Код:
retValue = CreateProcess("c:\\windows\\system32\\NotePad.exe", Nothing, IntPtr.Zero, IntPtr.Zero, False, 0, IntPtr.Zero, Nothing, sInfo, pInfo)
Process.GetCurrentProcess.Kill()

дает один и тот же результат, а именно:
родительский процесс освобождается и его программу даже можно удалить, только проблема в том, что дочерний процесс NotePad.exe оказывается привязанным к папке в которой находилась родительская программа, и пока дочерний процесс запущен, с этой папкой ничего поделать нельзя, ни переименовать, ни удалить, а это похоже уже никак не преодолеть.
 
PS
Правда это уже мелочи, просто на пару файловых операций придется сделать больше.
Вместо того, чтобы удалить старую папку и на её место распаковать новую, придется удалять из неё старое содержимое, а затем копировать новое.

Всего записей: 5509 | Зарегистр. 31-05-2009 | Отправлено: 12:47 16-10-2018 | Исправлено: 4seasons, 13:24 16-10-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это потому, что lpCurrentDirectory Nothing.
Текущая директория дочерного процесса тогда будет равна директории, где находится родитель, по этому она и не удаляется.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 13:54 16-10-2018
4seasons



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Цитата:
Это потому, что lpCurrentDirectory Nothing.  

А с этим что-то поделать можно или это просто констатация факта?

Всего записей: 5509 | Зарегистр. 31-05-2009 | Отправлено: 15:26 16-10-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно. Вместо Nothing прописать значение текущей директории для дочернего процесса.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 15:35 16-10-2018
4seasons



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Запустил notepad.exe с одинарными слешами так:

Код:
retValue = CreateProcess("c:\windows\system32\NotePad.exe", Nothing, IntPtr.Zero, IntPtr.Zero, False, 0, IntPtr.Zero, "c:\windows\system32\", sInfo, pInfo)

В результате папка с родительским файлом освободилась и её можно удалить.
 
Только Монитор ресурсов показывает такую картинку:

Причем в качестве lpCurrentDirectory можно указать любую директорию любого диска, например "d:" и на картинку монитора ресурсов это не влияет.

Всего записей: 5509 | Зарегистр. 31-05-2009 | Отправлено: 15:57 16-10-2018 | Исправлено: 4seasons, 20:21 16-10-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В сях \ имеет значение экрана символов переноса строки (\n), табуляции (\t), итд, по этому его самого надо экранировать им же. На C# можно писать @"c:\windows\system32" , если это смущает.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 16:18 16-10-2018
4seasons



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Предыдущий пост переписал.
 
В общем картина более менее ясная.
Чтобы дочерний процесс не занимал родительскую папку, нужно в lpCurrentDirectory указать путь к папке запускаемого процесса, в противном случае он будет держаться за папку родительского каталога.
Как то так ...

Всего записей: 5509 | Зарегистр. 31-05-2009 | Отправлено: 16:20 16-10-2018 | Исправлено: 4seasons, 18:08 16-10-2018
IHmG

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посоветуйте, пожалуйста, про логирование в asp net core чего почитать для чайников?
 
Читал https://metanit.com/sharp/aspnet5/2.10.php
 
краткое содержание
 
1. Конфигурация логгера
2. Настройка кофигурации логгирования
3. Создание провайдера логгирования
 
в статье простейшее логгирование сначала показывается на примере логгирования в консоль, затем показано как можно изменить дефолтную конфигурацию логгирования и выводить трассеровку и потом про создание своего провайдера (на примере вывода в файл)
 
Мало что понял. Цель - подготовка к тестовому заданию по asp net core. Проект написан на forms... хотят переносить на core.
 
Просматривал другие статьи, но вопросов сильно больше... так как пытаюсь запрыгнуть в net core даже без нания с#... на это просто времени пока нет. Нужно пройти собеседование и очень быстро включиться в работу.
 
Как я понял, можно в Configure подключить несколько логеров. Например, первый будет выводить информацию в консоль за текущую итерацию отладки, а второй - в файл (будем накапливать подробный трассировочный лог в один файл и копию из консоли во второй файл). Консоль позволяет выводить сообщения разного уровня соответственно через LogInformation, LogError и тп... как реализовать такие же расширения для своего провайдера логирования (файл, база данных и тп)? Такой провайдер должен реализовывать интерфейс ILoggerProvider... что гуглить в терминах C# ?
 
А еще очень интересно кто как реализует\настраивает инфраструктуру логирования в своих приложениях?
 
 
 
 
 
 
Добавлено:

Цитата:
Нашел причину. Теперь код работает как ожидается. Извините за беспокойство.

 
было бы здорово узнать, что нашли

Всего записей: 248 | Зарегистр. 07-06-2006 | Отправлено: 19:05 02-02-2019
IHmG

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вопрос решен буквально одной строкой в Startup.cs, в ConfigureServices нужно добавить  
 
Код:
services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });
 
Результат: JSON со значением "dog"  
Что и требуется =)

 
воспроизвел из вашего предыдущего поста (с постановкой задачи) и внес исправления с решением... но так и  не понял цели. Можете пояснить? Зачем этот REST нужен? какую Вы задачу решали... можно подробнее, пожалуйста

Всего записей: 248 | Зарегистр. 07-06-2006 | Отправлено: 21:31 02-02-2019
Zvezdmii_Lord

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
здравствуйте,  
 
В базе MySQL я создал столбец color_id. При полном выделении строки в datagridview и выбором цвета из combobox строка окрашивается в нужный цвет и в столбец color_id записывается цифра 1-красный, 2 - зеленый и тд. Но, соответственно, при обновлениии или при новом открытии формы цвета все еще скидываются, значит в загрузку формы и при обновлении нужно вызывать метод который будет обрабатывать столбец color_id и в соответствии с цифрой будет окрашивать строку.
 
 

Код:
 
public async Task SaveColor()
        {
            System.Data.Common.DbDataReader sqlRead = null;
 
            string c = "3";
 
 
            MySqlCommand sqlCom = new MySqlCommand("SELECT * FROM banks", MySqlConnection);
 
            sqlRead = await sqlCom.ExecuteReaderAsync();
 
 
            try
            {
                while (await sqlRead.ReadAsync())
                {
                    string i = sqlRead["color_id"].ToString();
                    for (int z = 0; z < dataGridView1.Rows.Count; z++)
                    {
                        if (i == c)
                        {
 
                            dataGridView1.Rows[z].DefaultCellStyle.BackColor = Color.Green;
                        }
                    }
 

 
Это пример для одного цвета, но когда i==c начинается окрашивание всех строк, а не именно той у которой color_id = 3 и это логично. Я это прекрасно понимаю. Но не могу допетрить как сделать так, чтобы окрашивалась именно та строка у которой color_id = 3. Столбец color_id я в datagrid не вывожу соответственно. Может есть другой способ реализации? Сам новичек и не являюсь программистом и не связываю свою жизнь  с этим делом, просто для общего развития)

Всего записей: 20 | Зарегистр. 25-08-2017 | Отправлено: 06:23 08-02-2019 | Исправлено: Zvezdmii_Lord, 06:49 08-02-2019
mxm1975



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С трудом понимаю твой русский язык и невнятное изложение. Предположу, что окрашивать строки в гриде нужно в соответствии с "color_id" из строки таблицы. Значит этот "color_id" нужно хранить в гриде. Чтобы не выводить этот столбец, в гриде есть свойство:
 
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridviewcolumn.visible
 
установи в false и столбец не будет выводиться. А для сравнения и окраски строки используй значение из этого столбца.
 
Если буквально читать твой код, то можно предположить, что порядок строк в гриде и таблице одинаковые. Значит внутренний цикл не нужен. Просто увеличивай переменную-счётчик "индекс строки грида" и ставь цвет строки в соответствии со значением из таблицы.
 

Всего записей: 279 | Зарегистр. 31-07-2002 | Отправлено: 09:42 09-02-2019
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Zvezdmii_Lord
Можно вообще обойтись без цикла. Но невидимый столбец color_id, как объяснил mxm1975, необходим.  
На Event dataGridView1.RowDataBound(Object sender, GridViewRowEventArgs e) использовать:  

Код:
 
if (e.Row.RowType == DataControlRowType.DataRow)
{
    switch (e.Row.Cells[index столбца].Text)   //значение столбца color_id
    {
         case "1":
               e.Row.DefaultCellStyle.BackColor = Color.Red;
               break;
         case "2":
               e.Row.DefaultCellStyle.BackColor = Color.Green;
               break;      
         case "3":
               e.Row.DefaultCellStyle.BackColor = Color.Blue;
               break;
    }
}
 

GridView.RowDataBound Event
GridView.DataBindingComplete Event - cell background color
switch  
 

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 10:46 09-02-2019 | Исправлено: dneprcomp, 10:59 09-02-2019
Zvezdmii_Lord

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Извините за то, что так пишу просто сижу уже долго с этой бедой) в datagridview нет события RowDataBound.
 У меня WinForms, столбез добавил, сделал скрытным, думаю что нужно использовать dataGridView1_RowPrePaint
 

Код:
 
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            if (e.RowIndex > -1 && e.RowIndex <= dataGridView1.RowCount - 1)
            {
                if (dataGridView1.Rows[e.RowIndex].Cells[10].Value.ToString() == "0")
                    ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
 
                if (dataGridView1.Rows[e.RowIndex].Cells[10].Value.ToString() == "1")
                    ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
 
                if (dataGridView1.Rows[e.RowIndex].Cells[10].Value.ToString() == "2")
                    ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
 
                if (dataGridView1.Rows[e.RowIndex].Cells[10].Value.ToString() == "3")
                    ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
            }
        }
 

 
Сделал так, при загрузке формы все окрашивается но сразу выбивает ошибку Ссылка на объект не указывает на экземпляр объекта.
Поставил точку, проходит все строки из базы и в момент когда данные для вывода заканчиваются, выбивает ошибку.
 
Проблему решил: if (e.RowIndex > -1 && e.RowIndex <= dataGridView1.RowCount - 1), учитывалась еще последняя строка, он соответственно пустая. Убрал '='.
Всем спасибо что подтолкнули с мертвой точки)
 
 
Добавлено:
Еще такой вопрос, возможно ли как то сделать и как, чтобы форма принимала размер datagridView, а то datagrid уходит за размер формы

Всего записей: 20 | Зарегистр. 25-08-2017 | Отправлено: 05:33 11-02-2019 | Исправлено: Zvezdmii_Lord, 06:57 11-02-2019
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Zvezdmii_Lord
Да, действительно для WinForms RowPrePaint. RowDataBound только для Web.

Цитата:
чтобы форма принимала размер datagridView

Я бы сделал DataGridView docked to fill the form (заполнить всю форму) и  
сделал DataGridView HorizontalScrollBar true.  
Так же можно в дополнение сделать Form HorizontalScrollBar true.
Horizontal Scrollbar on DataGridView
 
PS. Мне думается, что параметер DataGridViewRowPrePaintEventArgs e  это референс на текущую строку.
Eсли это так, то будет достаточно:  
 

Код:
 
 if (e.RowIndex > -1 && e.RowIndex <= dataGridView1.RowCount - 1)
{
                if (e.Cells[10].Value.ToString() == "0")
                {
                   e.DefaultCellStyle.BackColor = Color.White;
                }
                else if (e.Cells[10].Value.ToString() == "1")
                {
                   e.DefaultCellStyle.BackColor = Color.Red;
                }
                else if (e.Cells[10].Value.ToString() == "2")
                {
                   e.DefaultCellStyle.BackColor = Color.Yellow;
                }
                else if (e.Cells[10].Value.ToString() == "3")
                {
                    e.DefaultCellStyle.BackColor = Color.Green;
                }
}  

PPS. Вместо нескольких одиночных IF лучше использовать IF ELSE или SWITCH.
        Тогда срабатывать будет только один IF, а не каждый.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 09:14 11-02-2019 | Исправлено: dneprcomp, 09:37 11-02-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru