• Почему не работает запись в базу данных?

    @basrach
    вы упустили слово await перед context.SaveChangesAsync();
    Ответ написан
    1 комментарий
  • Стоит ли читать книгу Иэн Гриффитса "Программирование C# 5.0"?

    @basrach
    Книгу с названием "Программирование C# 5.0" читать в любом случае уже нежелательно, ибо на дворе C# 7.2 и скоро наступит C# 8.0.
    Данного автора не читал, не скажу за качество, но могу посоветовать:
    для начинающих: Эндрю Троелсен
    для более углубленного изучения: Джеффри Рихтер
    В принципе, если хорошо усвоите эти две книги, то будете свободно владеть языком.
    Ответ написан
    Комментировать
  • C#. Как получить значения из данного JSON?

    @basrach
    Добавьте атрибуты с названием полей, вот так:
    public partial class Joined
    {
    	[JsonProperty("avatar_url")]
    	public string AvatarUrl { get; set; }
    	[JsonProperty("display_name")]
    	public string DisplayName { get; set; }
    }
    Ответ написан
    Комментировать
  • Как заставить работать сайт на iis без запросов к сайту?

    @basrach
    1. Найти файл настроек IIS: %WINDIR%\System32\inetsrv\config\applicationHost.config
    2. В этом файле найти секцию applicationPools, найти там нужный appPool, добавить/заменить атрибуты на autoStart="true" startMode="AlwaysRunning", должно быть типа такого:
    <applicationPools>
      <add name="DefaultAppPool" autoStart="true" startMode="AlwaysRunning" managedRuntimeVersion="v4.0">

    3. Найти секцию sites, в ней нужный site, а там нужный application и добавить туда в тег application два атрибута: serviceAutoStartEnabled="true" serviceAutoStartProvider="ApplicationPreload"
    <sites>
        <site name="Default Web Site" id="1" serverAutoStart="true">
            <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="ApplicationPreload"

    4. Ниже, прямо после секции sites или перед закрытием тега system.applicationHost добавьте:
    <serviceAutoStartProviders>
        <add name="ApplicationPreload" type="MyNamespace.ApplicationPreload, MyAssembly" />
    </serviceAutoStartProviders>

    Обратите внимание! Значение name должно совпадать с значением serviceAutoStartProvider.
    Значением type должно быть полное имя класса-загрузчика (неймспейс, сборка), который будет запускать quartz при старте сайта.
    5. Реализовать собственно класс-загрузчик:
    public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
    {
        public void Preload(string[] parameters)
        {
            // Qurtz.Net.Start() // или как там хз
        }
    }


    При этом надо помнить, что пул может быть всё равно "прибит" IIS-ом, например, если исчерпан лимит по памяти. Необработанное исключение в вашем коде может его также остановить. Но после остановки он должен сразу же запускаться. Т.е. нельзя надеяться что некий код будет работать 24/7. Он будет прерываться, но сразу же запускаться.

    Также, лучше код запуска qurtz-а (тот что в методе Preload(string[])) повторить в методе Application_Start в Global.asax для надежности.
    Ответ написан
    Комментировать
  • Как с помощью регулярки C# удалить символ \?

    @basrach
    1. Regex.Replace(@"https:\/\/pp.userapi.com\/c841226\/v841226735\/72c15\/CrqCyt7DhCA.jpg", @"\\", "")
    2. HTML в общем случае невозможно описать регуляркой. Т.е. такая регулярка возможно будет косячить где-то, но в каких-то простых случаях отработает:
    var htmlString = ...
    var withoutTags = Regex.Replace(htmlString, @"<.*?>", ""); // удаляем теги
    var withoutSpaces = Regex.Replace(withoutTags, @"\s+", " "); // удаляем пробелы
    Ответ написан
    Комментировать
  • Проблема с DATETIME?

    @basrach
    Когда EF достает данные, можно сказать чтобы он даты считал в UTC.
    Посмотрите здесь и здесь.
    Ну дальше либо new DateTime(01.02.2018).ToUniversalTime(), либо new DateTime(31.01.2018, DateTimeKind.Utc)
    Ответ написан
    1 комментарий
  • EntityFramework - можно ли "скрестить" контексты?

    @basrach
    Можно.

    Контексты не знают друг о друге ничего, и нет никакой разницы, создаете вы два экземпляра одного класса контекста, или два экземпляра разных классов контекстов. Каждый экземпляр полностью изолирован и функционирует так, будто он один на свете. Т.е. в него можно пихать любые таблицы/сущности и мапинги лишь бы они были корректны с точки зрения схемы бд.
    Единственный минус возможно заключается в том, что какие-то маппингы придется дублировать в двух местах. Таким образом возможно могут быть нарушены принципы вроде DRY и еще какие-нибудь. Но, как предложили выше, наследование закрывает этот вопрос.
    В любом случае окончательно решение нужно принимать с учетом всех особенностей вашей архитектуры.
    Ответ написан
    Комментировать
  • Хранить список городов в бд или использовать сервисы?

    @basrach
    В любом случае нужно хранить у себя. Это даже не подлежит обсуждению. Чтобы ваш сервис не перестал работать, образно говоря, из-за того, что где-нибудь на другом конце мира уборщица шваброй задела провод. Но как вы правильно заметили, встает другая проблема - актуальность данных. А её решить достаточно просто. Забирайте данные из стороннего api периодически и обновляйте данные у себя в базе. Как часто это делать, и каким образом, полностью заменять локальные данные/подтягивать только обновления и т.д.? - Зависит от объема данных, природы этих данных и пр. В случае списка городов наверное можно автоматический апдейт делать раз в месяц или даже раз в квартал, или даже раз год. Не так часто появляются/исчезают/переименовываются города. И по необходимости можно запустить обновление вручную.
    Если вы не последуете этому совету и решите запуститься без локальной копии. То в скором времени вам всё равно придется переделывать. Потому что в реальном мире сети рвутся, сервера падают, фаерволы режут трафик, а сервисы внезапно перестают отвечать на запросы.
    Ответ написан
    Комментировать
  • Насколько ли плохи дефолтные контроллеры в ASP.NET MVC???

    @basrach
    Зависит полностью от вашей задачи. Вот сделали вы там что-то. Если это вас устраивает полностью, всё работает как надо, "они делают всё что необходимо" то значит и контроллеры и прочее - отличные. Может статься, что проект будет расти и усложняться. Когда дефолтные контроллеры + EF без дополнительных слоев абстракции перестанут "делать всё необходимое", а наоборот начнут только усложнять вам жизнь. Тогда вы сами поймете насколько и чем они плохи. До тех же пор, абсолютно ничего плохого в них нет.
    Ответ написан
    Комментировать
  • Какой алгоритм поиска дублей посоветуете Sql server?

    @basrach
    Как вариант. Можно привести сначала строки к какому-то "нормализованному виду". Например, удалить всё кроме букв, удалить места с наиболее вероятными ошибками (буквы а, о), заменить всю кириллицу на латиницу и т.п. и затем положить это всё в в словарь, где каждому такому "хэшу" будет соответствовать 5-10 похожих наименований. При добавлении новой записи сначала вычислять "хэш", затем по соответствующим ему 5-10-15ти записям пройтись нормальной функцией поиска соответствия. Идея в том, чтобы не шерстить все 70к каждый раз, более 90% из них очевидно даже близко не похожи. Собственно нужно просто подобрать способ как отфильтровать эти 90+% заранее.
    Ответ написан
    Комментировать
  • Как сделать выполнение функции после отсчета таймера одной секунды (не Thread.Sleep(1000)) в c#?

    @basrach
    this._timer = new System.Windows.Forms.Timer();
    this._timer.Interval = (int)TimeSpan.FromSeconds(1).TotalMilliseconds;
    this._timer.Tick += (e, args) =>
    {
    this._timer.Stop();
    if (card2 == 0)
    {
    pictureBox3.Image = System.Drawing.Image.FromFile (@"D:\Roma\card1.jpg");
    }
    };
    this._timer.Start();
    Ответ написан
    Комментировать
  • Можно ли инжектировать WindowsIdentity в конструктор WCF сервиса?

    @basrach
    Можно. Реализовать фабрику, которая будет лениво вытаскивать identity из контекста, и эту фабрику резолвить в конструкторе сервиса. Делать это нужно именно лениво потому как инстанс службы создаётся до авторизации, а вызов метода службы происходит после успешной авторизации, соответственно на момент создания инстанса службы в контексте будет анонимус либо ничего, но зато там определенно будет что-то на момент вызова метода. Поэтому дергаем фабрику на вызове метода и получаем значение из контекста.
    Ответ написан
    Комментировать
  • Как правильно запустить первым класс?

    @basrach
    Компилятор говорит, что не может понять какой параметр типа (generic type parameter) нужно подставить вместо TContext в метод SetInitializer и просит этот TContext указать явно. Но указывать явно на самом деле не нужно, нужно сделать так, чтобы StaticDbInitializer реализовывал интерфейс IDatabaseInitializer где контекст вероятно должен также быть унаследован от какого-нибудь DataContext-а.
    Первый шаг, который нужно предпринять - записать объявление класса как:
    public class StaticDbInitializer : IDatabaseInitializer
    {
    ....
    Где MyContext - класс, который представляет... некий контекст

    PS Локализованная IDE - зло
    Ответ написан
    Комментировать
  • Какие минусы могут вылезти в дальнейшем при такой примитивной реализации очереди задач?

    @basrach
    При такой реализации проблемы вылезут сразу, как только случится несколько одновременных запросов к вашей службе из-за отсутствия синхронизации потоков, если только вы не используете Single режим для службы. Но тогда непонятны заморочки c Parallel.ForEach и прочие очереди.
    1. в addCall несколько потоков могут попытаться добавить один и тот же ключ в словарь calls и это будет exception
    2. в invokeAll перед выходом очищается словарь calls, при этом на момент выходы из этого метода в нем вполне могут оказаться новые команды, которые будут также удалены
    3. Wait() перед выходом из AddDataToDevice заблокирует поток, который будет ждать окончания выполнения другого потока, который был запущен в Parallel.ForEach - странно выглядит
    4. В методе getInfo не обрабатывается ситуация отсутствия ключа в словаре, в таком случае будет выброшено исключение
    5. перед вызовом invokeAll не проверяется был ли завершен предыдущий вызов. Если первый вызов invokeAll не успел завершиться за минуту и придет второй, то тут вообще начнется каша от исключений при переборе ключей словаря, до отправки одних и тех же команд несколько раз
    6. Данные из словаря callsInfo не удаляются, что при длительной работе приведет к утечкам со всеми вытекающими
    Но если вы используете Single mode для WCF service-а, либо в один момент времени может быть только один запрос на сервис, то наверное будет работать.
    Ответ написан
    2 комментария