passt denn die Collation der Datenbank und die des Feldes?
Ich habe ehrlicherweise mit .NET immer vermieden mit MySQL zu arbeiten - jedesmal, wenn ich es machen musste gab es Probleme, die es mit anderen DBMS nicht gibt.
Vielleicht kannst du mal in den Sourcen von PHP schauen, was die an die DB senden, beim Aufruf von http://php.net/manual/de/mysqli.set-charset.php
ich stehe davor, meiner Applikation ein RealTime Dashboard zu verpassen.
Hierfür möchte ich SignalR einsetzen, da die Daten auch eingangs gestreamed werden.
Idee ist also folgendes:
-> Daten kommen als Stream durch eine Message Queue
-> WebApp hängt an der Message Queue (--> hier fehlt mir eine bessere Idee, da diese Architektur nicht so schön skalierbar ist... da jede Nachricht nur von einem Client empfangen werden kann)
-> WebApp pusht per SignalR (IHubContext<THub>) in einem IHostedService die Daten an die Clients
Meine aktuellen Herausforderungen - und da finde ich leider die Dokumentation etwas unzureichend - sind:
-> Bessere Idee für die Schnittstelle MessageQueue -> WebApp
-> Wie mache ich das Multimandantenfähig?
Multimandantenfähig heißt in dem Fall:
Ein User hat einen bestimmten Mandanten (gewählt), in diesem mandanten gibt es n unterschiedliche Signale, die über SignalR kommen können. Ein Subset aus diesen Signalen hat er zu seinem Dashboard hinzugefügt.
Frage in dem Fall:
-> Besser viele SignalR Gruppen oder wenigere?
Die Frage bezieht sich darauf, ob ich für jedes Signal eine eigene Gruppe erstellen sollte (Dabei können wir gut auf 100k Gruppen kommen, wenn mal mehr als ein Mandant läuft; was ich für ziemlich viel halte!) oder macht es Sinn jedem Dashboard eine Gruppe zu geben und hier die Daten aufbereitet hinzusenden, was mich wieder zu der ersten Herausforderung führt: Die Schnittstelle MessageQueue -> WebApp müsste dann besser skalierbar sein.
Gehostet werden soll das ganze auf Azure. Ein SingalR Service wäre dann sicherlich eine Option.
Es gibt sicherlich schönere Lösungen als das hier, aber das was du machen musst zeigt es denke ich ganz gut:
void Main()
{
Dictionary<int, Test> dictionary = new Dictionary<int, UserQuery.Test>()
{
{0, Test.A},
{1, Test.B},
{2, Test.A},
{3, Test.C},
{4, Test.A}
};
dictionary.Dump("Initial");
var duplicates = dictionary
// finde einträge bei denen
.Where(x =>
// irgendein Eintrag existiert, der
dictionary.Any(y =>
// nicht dem eigenen Eintrag entspricht, aber
y.Key != x.Key &&
// den gleichen Wert hat
y.Value == x.Value))
// hole dir die Keys der gefundenen Einträge
.Select(x => x.Key)
// Kopiere sie in eine Liste (Kann auch ein Array sein, wichtig ist nur diese zu kopieren, sonst geht der foreach nachher schief)
.ToList();
duplicates.Dump("Duplicates");
foreach (var toRemove in duplicates)
{
dictionary.Remove(toRemove);
}
dictionary.Dump("Final");
}
// Define other methods and classes here
enum Test
{
A,
B,
C
}
Ausgabe siehe Anhang. Das snippet ist erstellt mit LinqPad (Daher kommt das .Dump() und die Ausgabe)
Hast du garkeine Internetverbindung oder hängst du hinter einem Proxy?
Es gibt verschiedenste Möglichkeiten einen eigenen, offline Nuget Server aufzusetzen, der entweder sich ins Internet verbinden kann und so den offiziellen mirrorn kann oder in den du deine benötigten Pakete selber hinterlegen musst.
In der einfachsten Form kann das auch ein Netzwerk Share sein.
meine Bedenken (vermutlich unbegründet) liegen darin, dass ich in diesem Projekt begrenzte Ressourcen habe (es soll unter IoT Edge auf Win 10 IoT Core laufen) und dort Daten von externen Geräten einsammeln. Das soll möglichst schnell geschehen und soweit das möglich ist (immerhin reden wir von einer managed Sprache und einer Prozessvirtualisierung) deterministisch, sprich mit wenig Jitter.
Quartz hat bei meinen Tests da auch die besten Ergebnisse geliefert, ich habe leider die Zielhardware noch nicht, so dass ich da noch keine Tests mit machen konnte und bisher nur ein grobes Konzept.
Meine expliziten Bedenken sind, dass viele parallel vom Scheduler getriggerte Jobs gleichzeitig anlaufen und ich dann durch das erstellen der ganzen Objekte, suchen der TCP Verbindung usw.. einen relativ großen Overhead und damit eine Verzögerung reinbekomme.
Deswegen suche ich nach Erfahrungswerten. Ich habe Quartz selber schon eingesetzt, dabei aber eher sowas wie "mache alle 10 min etwas" auf einer Windows VM umgesetzt. Hier kann es auch darum gehen alle 200ms etwas zu triggern.
ich mache mir gerade Gedanken darum, wie ich am sinnvollsten ein kleines Schedulingproblem lösen kann.
Ich benötige ein Scheduling für Datenpolling Aufgaben im Sekunden oder ggf. auf Sub-Sekunden bereich, es soll so z.B. alle x sec ein neuer Datenabruf gestartet werden.
Ich habe mir hier bereits mehrere Scheduling Libs wie Quartz oder Hangfire angesehen und denke dass man das damit (vorallem Quartz) ganz gut lösen könnte, habe aber ein wenig Angst vor dem Overhead, den die Libs mitbringen.
Hat jemand hier ggf. bereits Erfahrungswerte?
In C/C++ hätte ich die Threads vermutlich einfach an eine Semaphore gehangen - den Weg versuche ich gerade einmal in C# zu konstruieren, bin mir aber relativ sicher, ob das der richtige Weg ist.
Edith sagt: Noch ein paar Infos sind vielleicht ganz hilfreich...
-> Basis Framework .net core 2.1
-> Laufzeitumgebung wird docker sein
-> Das Scheduling soll permanent laufen, die unterliegenden TCP Verbindungen werden separat verwaltet und debugged, es laufen im Scheduling dann "nur" die Applikationsschicht Clients
-> Nach dem Abfragen der Daten müssen diese noch von ushort[] in Zieldatentypen konvertiert werden, dies soll innerhalb des schedulten Task stattfinden
-> Transport Protokoll ist Modbus/TCP
Den Namen selber gibst du ja bei der Registrierung des Services an. Dabei ist es unerheblich, ob du diesen über die passenden .NET Framework Klassen, die sc.exe oder mithilfe einer Lib wie TopShelf installierst.
Du könntest den relevanten Code (also die Registrierung des Service) einfach direkt hier posten.
Hast du denn mal Google bemüht mit deinem Fehler?
Brauchst du zwingend die Versionsangabe im Connection String - in der offiziellen Doku bzw. Codebeispiel daraus ist die auch nicht drin (da bin ich übrigens mit "ef core sqlite version" via google hingekommen).
du kannst durchaus einzelne Repositories pro Teilprojekt anlegen, das bringt aber nur Komplexität in dein Sourcecode handling und würde nur dann Sinn machen, wenn du die Teilprojekte anderweitig noch verwendest. Wenn du allerdings die Teilprojekte anderweitig verwendest ist es wesentlich sinnvoller diese in einen Paketmanager (für .net wäre das nuget) auszulagern. Möchtest du deine nuget Pakete nicht veröffentlichen, so kannst du auf private Feeds oder auch einen Ordner zurückfallen um deine Pakete zu verwalten.
Dafür musst du allerdings erst einmal an einen Punkt kommen, an dem du die notwendigkeit hast ein Teilprojekt ausserhalb deiner aktuellen Solution zu verwenden.
Aktiv in der Weiterentwicklung ist auch dieses DataGrid: https://github.com/xceedsoftware/wpftoolkit
Die Community Version kann meines Wissens nicht filtern, das ließe sich aber selber programmieren. Was die Pro Version kann müsstest du dort nachschauen.
Den Link kannte ich nicht, aktuell scheint es aber nicht zu sein - das ist noch das alte Azure Portal.
Ob das noch so funktioniert kann ich nicht sagen, ich wollte allerdings explizit den Weg über den Key Vault gehen.
ja normalerweise kümmere ich mich um jede Exception, bis ich verstanden habe weshalb sie kommt und wie ich sie beheben kann :)
Dieses mal bin ich, um eine funktionierende Lösung zu haben, temporär auf
.AddDeveloperSigningCredentials()
umgestiegen, was das Problem umgeht.
Hier der passende Code Teil
string certString = Configuration.GetValue<string>("IdentityServerPfx");
// TODO: fix this, on AzureWebApp creating the cert from bytes fails with Exception
if (string.IsNullOrEmpty(certString))
{
builder.AddDeveloperSigningCredential();
}
else
{
byte[] certBytes = Convert.FromBase64String(certString);
X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.Exportable|X509KeyStorageFlags.UserKeySet);
builder.AddSigningCredential(cert);
}
und die Exception:
Fehler
Unhandled Exception: Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: The system cannot find the file specified
at Internal.Cryptography.Pal.CertificatePal.FilterPFXStore(Byte[] rawData, SafePasswordHandle password, PfxCertStoreFlags pfxCertStoreFlags)
at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(Byte[] rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
Ich habe schon verschiedene Sachen geprüft, einfach um sicher zu gehen, dass die Services alle passen:
Die KeyVault Verbindung funktioniert (es werden andere secrets abgerufen)
Die Zertifikat Bytes stimmen mit denen überein, die lokal bei mir funktionieren
Das Zertifikat aus lokaler Dateiquelle eingelesen funktioniert auch nicht (Einlesen nach byte -> gleicher Konstruktor)
Zu der Exception habe ich eigentlich nichts gefunden, was auf meine Umgebungskonstellation passt. Das scheint so niemand zu machen (oder niemand hat Probleme damit), das Zertifikat aus einem KeyVault zu holen.
P.S.:
mein "temporärer fix" war
if (string.IsNullOrEmpty(certString) || true)
... nur der Vollständigkeit halber, damit der Kommentar im Code nicht "sinnlos" dasteht :)
ich versuche ein X509 Zertifikat aus einem Bytearray zu erstellen.
Ich benutze dies in einer .net core 2.0 (ASP MVC) app.
Das erstellen des Objektes funktioniert lokal in meinem VS mit den gleichen Zertifikatsbytes (abgefragt aus einem Azure Key Vault) wunderbar. Lade ich die App allerdings als WebApp hoch und führe es dort aus bekomme ich eine Exception, welche im Text auf FileNotFound verweist.
Unter der Exception habe ich bei Google leider nichts auf mein Problem zutreffendes gefunden, habe mir die genaue Exception dummerweise auch nicht notiert und kann sie erst morgen wieder reproduzieren. Aber vielleicht hat ja jemand bereits etwas ähnliches gemacht.
Edit: Das Zertifikat soll zum signieren bei einem IdentityServer eingesetzt werden, das sollte hierauf aber keinen Einfluss haben, da es ja schon im Konstruktur des Zertifikat Objektes knallt.
Hast du dir deine Antwort nicht schon selber gegeben?
Zitat
Bei Word kann ich ja über die Befehlzeile mitgeben, welches Dokument geöffnet werden soll.
So was ähnliches, nur das eben die Anwendung schon offen ist, und es auch nur eine Instanz von ihr gibt.
Warum machst du nicht genau das?
Deine zweite Anwendung (wenn es eine zweite sein muss..) wird mit einem Parameter aufgerufen. Von dieser zweiten Anwendung kann es nur eine Instanz geben. Google spuckt dazu eine ganze Menge aus. Ist schon eine Weile her, dass ich genau sowas auch implementiert habe.
bei mir war es tatsächlich die Docker Version am Client, mit der ich die Images gebaut habe.
Ich bin jetzt auf meinem Entwicklungsrechner zurück auf 17.06.2-ce gegangen und habe das gleiche image neu gebaut. Es ließ sich wunderbar aus der Registry pullen und läuft problemlos.
vielleicht habe ich dann etwas falsch interpretiert oder wiedergegeben.
Installiert habe ich dieses: https://store.docker.com/editions/enterprise/docker-ee-server-windows
Eine Version steht auf der Webseite nicht dabei, ich kann aber morgen mal die Versionsnummern des installierten auslesen, da ich neu installiert habe sollte hier aber der aktuelle Stable installiert sein.
Das, was ich ausdrücken wollte ist: Es funktioniert problemlos mit dem Windows 10 und dem "Docker for Windows", welches auf der Docker Store seite als "CE" bezeichnet wird, allerdings nicht mit dem als "EE" bezeichneten für Windows Server 2016.
Da das Image ausschließlich unter Windows laufen soll habe ich bisher nicht probiert das Image als Linux Version zu erstellen, geschweige denn laufen zu lassen.
Edit:
Wie stelle ich so eine Kompatibilität her?
Mein Image baut sich vom Grund her wie folgt auf:
-> Basis Layer ist microsoft/aspnetcore:2.0
-> ENV Layer
-> Für Windows, published ASP Net Core 2.0 App
Edit #2:
Kopf -> Tisch... Danke für den Ansatz.. es gab ja vor ein paar Tagen ein Docker Update, allerdings nicht für die Windows Server Version vermute ich mal.
Vielleicht kommt die inkompatibilität da her.
ich entwickele gerade eine ASP Net Core Applikation, die in Docker als Windows Container laufen soll.
Wenn ich das Image dann aus meiner Container Registry pullen will schlägt dies mit dem Fehler "The system cannot find the path specified." während des extrahierens fehl.
Allerdings tritt dies nur unter Windows Server 2016 mit Docker EE auf, nicht unter Docker CE auf meiner Entwicklungsmaschine oder eine Windows 10 Entwicklungsmaschine in Azure auf.
Alles was ich in den Docker issues o.ä. gefunden habe war nie Image Spezifisch und die Punkte (Bitlocker, Antivirus, etc..) habe ich auch alle erfolglos durch, bevor ich das ganze einmal auf einer Windows 10 Maschine getestet habe.
Hat schon einmal jemand ein ähnlich gelagertes Problem gehabt oder eine Idee, wo ich hier ansetzen könnte?
ich vermute, dass was du suchst ist die Klasse StopWatch, ein Timer löst nach dem ablaufen einer Zeit ein Event aus, eine StopWatch zählt bis zu einem Event.
Hilft dir das weiter? Wenn nicht müsstest du bitte einmal deinen bisherigen Ansatz zeigen.
class Table
{
public string[] Header { get; set; }
public Row[] Data { get; set; }
}
class Row
{
public DateTimeOffset Timestamp { get; set; }
public double?[] Values { get; set; }
}
Beispielinhalt siehe Screenshot unten.
Diese möchte ich nach Json Serialisieren. Das würde so funktionieren, denn ich bekomme sie via Json übertragen, aber um sie später einmal in eine NoSQL Datenbank speichern zu können würde ich das Datenformat gerne "transponieren" und nach JSON serialisieren. Natürlich könnte ich da einfach mit einem Stringbuilder rangehen, finde ich allerdings nicht sehr elegant.
Für Newtonsoft.Json gibt es ein paar Beispiele wie man eine DataTable in der Form serialisieren kann, den Umweg würde ich allerdings ungerne gehen.
Auch, wenn das eigentliche Problem gelöst ist, gegenfrage:
Warum kopierst schreibst du die Test.exe und startest sie dann? Wenn du die Sourcen hast und beim Kompiliervorgang die Test.exe sowieso mitkompiliert wird - was spricht dagegen, die Klassen, die jetzt in die Test.exe einkompiliert werden aus deinem Programm direkt anzusprechen?
die Lösung deines Problems wäre eine [Artikel] Drei-Schichten-Architektur .
"Irgendwo" laufen Daten in einer Datenschicht an und werden der GUI zur Verfügung gestellt. Das würde allerdings ein Refactoring deines Programms bedeuten.