Laden...
J
Jelly myCSharp.de - Member
Burden (Luxemburg) Dabei seit 09.09.2007 1.114 Beiträge
Benutzerbeschreibung

Forenbeiträge von Jelly Ingesamt 1.114 Beiträge

31.07.2009 - 09:47 Uhr

Ich arbeite als Softwareingenieur in einem Krankenhaus, für das wir in einem Team hauseigene Software schreiben. Die Thematiken sind sehr vielseitig, und bei gewissen Projekten auch sehr technisch (also nicht nur Insert in DB schreiben und DataGrids darstellen). Insbesondere wichtig in meiner Branche ist der Datenschutz, Benutzerauthentifizierungen u.ä.

Ursprünglich hab ich aber ein abgeschlossenes Physikstudium hinter mir, aber irgendwie hat mich die Softwareentwicklung dann doch mehr gereizt, zumal auch die Berufsaussichten wesentlich besser waren. Und da bin ich nun hängengeblieben und auch sehr zufrieden damit.

Privat meide ich meinen Laptop wann immer ich nur kann, einfach nur um rechteckige Augen im 16:9 Format zu vermeiden. Früher zu Studiumzeiten war das anders, da wurde alles Mögliche in meiner Freizeit programmiert. Aber heute mit Familie sind andere Dinge bedeutend wichtiger geworden, vor allem wenn man in ein paar Jahren nicht als Informatikerdepp dastehen will. Hobbies sind mir wichtig, die eben nichts mehr mit Computern zu tun.

31.07.2009 - 09:18 Uhr

ClickOnce ist der letzte Fisch. Das Ganze müllt dir lediglich dein Userverzeichnis voll mit diversen Files, die man nachher noch nicht mal wiederfindet. WasMS mit dieser Verschleirungstechnik bezweckt ist mir fremd.

Ich habe das auch für eine Anwendung mal hier getestet, und bekam von unseren Admins eins auf den Deckel. ClickOnce Deployment verträgt sich nämlich überhaupt nicht mit serverseitig gespeicherten Benutzerporfilen. Würden wir sämltiche Applikationen über ClickOnce verteilen, hätten wir nicht nur Userprofile von 500MB, sondern auch noch das Problem, dass wir noch nicht mal alle Konfigurationen vornehmen könnten, weil dem User die Rechte fehlen.

Wie gesagt, der letzte Fisch, und höchstens brauchbar um mal was auf die Schnelle bereitzustellen. Für alles andere müssen Setups her.

Meine Meinung

30.07.2009 - 14:13 Uhr

Warum? Wenn ich dem Client schon eine Information schicke, dann kann ich doch auch beginnen ihm Daten zu senden, oder nicht!?

Weil dadurch dein CallBack Contract schlanker bleibt. Es reicht doch aus, dem Client ein PleaseUpdateData zu schicken. Der Client kann dann entscheiden, was er weiter macht. Vielleicht gibt es auch Clients, die irgendwann einmal vielleicht nichts updaten brauchen.

30.07.2009 - 07:43 Uhr

Wenn du ein sicheres Binding benutzt (Transport oder Message ist dort egal), dann muss der Client sich zwingend gegen den Server authentifizieren bzw. muss dem Server bekannt sein, da ja sonst keine asynchrone Verschlüsselung möglich ist. Das wiederum heisst, dass du entweder die Windowsauthentifizierung nimmst oder mit Zertifikaten arbeitest. Ersteres ist in einer eigenen Domain am einfachsten. Arbeitest du aber über Domaingrenzen hinweg, wirst du um ein Zertifikat nicht herumkommen.

30.07.2009 - 07:39 Uhr

Wenn du scihon vom Server aus die Daten dem Client pushen willst, dann halte zumindest den Contract schlank. Schick den Clients einfach nur ein Event, er solle doch bitte seine Themen aktualieren, mehr nicht.

20 Clients à 100 Datensätze sollten nicht wirklich ein Performanceproblem darstellen.

20.07.2009 - 13:13 Uhr

Ein Dienst, egal unter welchem Konto er läuft, sollte sich nicht einfach so ohne Grund beim Ausloggen verabschieden...

Was macht der Dienst konkret. Machst du irgendwelche Gui Ausgaben im Dienst?

20.07.2009 - 11:15 Uhr

Das ist ja Sinn eines Dienstes 😃
Natürlich läuft der weiter.

20.07.2009 - 11:01 Uhr

Ob die Änderung mit dem Parameter "-g" wirklich was bringt, kann ich natürlich nicht garantieren. Das ist halt nur so eine Idee. Ich weis nicht, wie eure Infrastruktur aussieht, aber können die Admins dir nicht eine zweite Instanz aufbauen, mit einer exakten Kopie der Ersten? Ressourcen habt ihr ja über 🙂

Unser Mann dafür ist heut in Urlaub. Mal kucken, was wir da machen können. Eventuell können wir eine Wartung mal für abends im Haus ankündigen, aber das gestaltet sich immer als schwierig. (Resourcen im Überschuss ist gut 🙂 Ein Testsystem muss aber erstmal aufgesetzt werden...)

Immerhin können die dir gleich helfen 🙂

Und hätten ja dann auch sogar die Zeit dafür... 😁

20.07.2009 - 09:27 Uhr

Also, starte mal den SQL Server mit dem Parameter "-g" und die Anzahl der MB, die für den Prozess reserviert werden.

Uiii.... Also da muss unser Admin ran. Ich kann im laufenden Betrieb leider nicht einfach mal so den SQL Server neu starten. Dann kloppen mir (zu Recht) 400 Ärzte und Krankenpfleger auf den Kopf.

Bist du dir mit der Message sicher. Wenn ich mir die Codes auslese, finde ich nur die Information dass der Fehler 701 eben dieser "There is insufficient system memory to run this query." bedeutet. Aber eine Info, wann dieser Fehler denn ausglöst werden kann, finde ich nicht.

Dass zuviele Assemblies geladen werden, kann eigentlich nicht sein, da dies die einzigen CLR Routinen in allen Datenbanken auf dem Server sind. Ein einziger Verweis der eine popelige Table in der CLR Funktion zurückgibt kann doch dann eigentlich kein Problem darstellen. Es würde mir zumindest nicht einleuchten.

20.07.2009 - 08:53 Uhr

Hier der genaue Fehlercode:

Msg 701, Level 17, State 13, Procedure TagsFromAeroAsset, Line 3
There is insufficient system memory to run this query.

Der Fehler wird ausgelést bei folgendem Statement:


CREATE FUNCTION [Aero].[TagsFromAeroAsset](@aeroAssetId [bigint])
RETURNS Table(macAddress nvarchar(50) null) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [AeroScout.CLRNET].[UserDefinedFunctions].[TagsFromAeroAsset]
GO

Làuft auf 32bit. Spezielle Assemblies sind nicht referenziert, ausser einem Webservice. Habe den aber mal testweise auch wieder rausgenommen, und eine wirklich elementare TVF Function erstellt mit demselben Ergebnis. Und wie ein Post weiter ober schon geschildert: Auf meinem SQL Express daheim làuft das Ding einwandfrei.

Die SQL 2005 Server Version ist der: 9.00.4035.00 SP3 Standard Edition. Die Machine hat 2 Quadcore Prozessore und 4 GB RAM, wovon noch reichlich zur Verfügung steht.

20.07.2009 - 08:09 Uhr

Es ist Montag morgen, und meine Befèrchtung hat sich bestàtigt.... Ich krieg immer noch obige Fehlermeldung, auch bei nvarchar().

Ist ja nicht so, dass ich nach dem Problem schon gegoogelt hàtte. Nur hab ich noch nichts Sinnvolles dazu gefunden. Also wenn jemande dazu passend einen interessanten Link hat... nur her damit 8)

18.07.2009 - 14:16 Uhr

Ich meld mich 😃
Ich hoff dass es daran liegt. Es geistern nämlich auch Gerüchte herum, dass man ein SP2 aufspielen sollte, da gewissen TCF unter CLR Probleme bereiten. Allerdings betrifft dies nur JOIN Queries... Ein Update unseres SQL Server's gestaltet sich allerdings als schwiergig und wir möchten den nur ausführen wenn unsausweichlich...

Naja, Montag mal abwarten.

18.07.2009 - 14:03 Uhr

Hast du mal versucht die DLL manuell über CREATE ASSEMBLY auf den Server zu deployen?

Ja, hab ich. Die Assembly krieg ich noch sauber importiert, und die gleiche Fehlermeldung spuckt mir der SQL Server dann aus, wenn ich versuche über "Create function... from external" die Funktion anzulegen.

Ich habe jetzt mal auf meinem privaten SQL Express dieselbe Funktion ausporbiert, und da lautete die Fehlermeldung anders, aber deutlich aussagekräftiger. (Privat nutze ich eine deutsche Version). Der Fehler, den ich hier erhielt sagte aus, dass ich keine VarChar Spalte zurückgeben kann. Ich hab mir jetzt eine nvarchar Spalte zurückgeben lassen, und die Funktion wurde einwandfrei importiert.

Ich hoffe dass der Fehler bei der Arbeit auch darauf zurückzuführen ist, dann wär das Problem gelöst. Mehr dazu kann ich aber erst am Montag schreiben.

17.07.2009 - 16:55 Uhr

Kannst du dessen Aussage ausschließen?

Ich denke schon. Der Server hat RAM und CPU im Überfluss. Und am Client sind auch massig Resourcen frei. Wenn ich diese eine Funktion weglasese, lässt sich ja alles wunderbar in den SQL Server installieren.

Der Deploy sieht doch so aus, dass das VS die DLL hochschickt, und dann einige T-SQL Skripte hinterher um die Assembly dann auch schön SQL Server zu importieren und dort die T-SQL Funktion anlegt.

17.07.2009 - 16:03 Uhr

verwendetes Datenbanksystem: MSSQL 2005

Ich muss eine .NET Funktion in den SQL Server importieren, die eine Tabelle zurèckliefern soll... Die Funktion an sich ruft einen Webservice auf, erhält dort ein Array von strings (das klappt alles). Dieses Array soll nun in der SQL Funktion als Tabelle zurückgegeben werden... Das Ganze sieht codemässig so aus:


[SqlFunction(FillRowMethodName = "FillRowWithMacAddress", TableDefinition = "macAddress varchar(max)")]
public static IEnumerable TagsFromAeroAsset(Int64 aeroAssetId)
{
    AssetFunctionalities ws = new AssetFunctionalities();
    string[] macAddresses = ws.TagsFromAeroAsset(aeroAssetId, true);


    return macAddresses;
}

public static void FillRowWithMacAddress(object obj, out SqlString macAddress)
{
    macAddress = (SqlString)obj;
}

Kompilieren tuts einwandfrei. Wenn ich aber nun versuche, übers VS das Projekt in den SQL Server zu setzen (Deploy), krieg ich folgende Fehlermeldung:

There ist insufficient system memory to run this query.

Es gibt noch andere FUnktionen, die allerdings jeweils nur einen skalaren Wert zurückgeben. Kommentier ich also meine neue Funktion im Code aus, so klappt auch das Deployment wieder.

Also ich seh so direkt allerdings keinen Fehler in meinem Code?

13.07.2009 - 13:59 Uhr

Wie sicher ist das ganze?
Wenn ich das Programm jetzt der ganzen Welt zum download anbiete?
So das die ganze Welt auf meiner Website news schreiben kann?

Das ist ungefähr so sicher wie in den Bronx einen Posche mit Schlüssel und laufendem Motor stehen zu lassen...

Naja, vielleicht etwas überspitzt formuliert. Aber mit einem Packetsniffer, Reflector und ähnlichem Werkzeug lässt sich relativ leicht den ConnectionString ausspionieren.

Lösung:
Arbeite mit einer Zwischenschicht (WCF Server, Remoting, Webservices), und lass die Clients sich dagegen authentifizieren. Sicher ist hier ein Zertifikat. Etwas leichter ist das Verteilen eines Logins und Passowortes... Als Methoden im Service bietest du dann wirklich nur das an, das die Clients zum Arbeiten brauchen (z.B. AddCustomer). Direkte Befehle auf die DB werden so nicht abgesetzt können.-

10.07.2009 - 08:54 Uhr

Jaja, das berühmte Linq. Leider arbeite ich noch zu viel in .NET 2.0 und vergess dadurch immer wieder dass es mit Linq oft eleganter geht.

10.07.2009 - 08:45 Uhr

Die ByDate Methode könnte so aussehen:

private int ByDate(Person p1, Person p2)
{
    if (p1.Vorname != "Christian" && p2.Vorname != "Christian")
        return p1.Geburtstag.CompareTo(p2.Geburtstag);
    else if (p1.Vorname == "Christian" && p2.Vorname != "Christian")
        return -1;
    else if (p1.Vorname != "Christian" && p2.Vorname == "Christian")
        return 1;
    else
        return p1.Geburtstag.CompareTo(p2.Geburtstag);
} 
10.07.2009 - 08:25 Uhr

Die generische Liste hat doch bereits eine Sort-Methode. Wo liegt das Problem?


list.Sort(ByDate);

private int ByDate(Person p1, Person p2)
{
    return p1.Geburtstag.CompareTo(p2.Geburtstag) ;
}

Doku lesen kann sehr hilfreich sein bei solchen Fragen.

Ok, hab grad gesehen, du willst nach 2 Kriterien sortieren... Dann muss halt die ByDate Methode angepasst werden, und berücksichtigt werden, ob es sich um Christian handelt oder nicht.

10.07.2009 - 08:19 Uhr

Welche Information beinhaltet denn 1 Pixel. Nur ein True/False Flag oder mehr?

Da es sich letzlich um 1024 identische Werte handelt (von der Struktur her mein ich), ist es geschickter statt in die Breite zu arbeiten, in die Tiefe tu gehen, sprich:

Eine Tabelle Spektrum: mit SpektrukId, Datum, Name und allem was sonst direkt am Spektrum haftet
und
eine Tabelle Pixel mit einer Referenz auf ein SpektrumId. Dann bleiben noch 2 Informationen pro Pixel: 1. die Position, also fortlaufend numeriert von 1..1024 und der PixelWert (dein Boolean Flag oder byte oder was auch immer in einem Pixel steckt).
d.h. also du kriegst für jedes aufgenommen Spektrum 1 Record in Spektrum und 1024 in Pxel.

10.07.2009 - 08:00 Uhr

Hei Leute will über ein DataSet eine Tabelle laden die 1024 Spalten hat.

8o 8o

Bist du dir sicher, dass du eine angepasste Datenstruktur gewählt hast ?

Ich kann mir schon vorstellen, dass dir RowSize begrenzt ist: klick

Auch bei den meisten DBMS Systemen ist die maximale Spaltenanzahl und Recordlänge oft begrenzt. Eine solche Datenstruktur ist meistens unsinng und sollte anders aufgeteilt werden... Wenn du uns verräts, was für Daten du speicherst, kann man dir vielleicht einen Tipp geben, das Ganze anders zu modellieren.

09.07.2009 - 20:38 Uhr

das frustrierende an meiner situation ist, das die firma dennoch gewinne macht. die haben nur gleich geschäftsjahresende und wollen die bilanzen aufpolieren

das kann ich nicht verstehe. kenn mich mit deutschem recht zwar nicht so aus, aber zumindest hier in Luxemburg ist es so, daß nur Betriebe Kurzarbeit anmelden dürfen, die auch wirklich in finanziellen Nöten sib (oder geraten könnten).

Ich selbst bin in der glücklichen Lage im Krankenwesen tätig zu sein. Und krank werden die Leute auch in Krisenzeiten...

Lass den Kopf nicht zu sehr hängen, sondern nutze jede Chance die sich biietet. Nach jeder Talfahrt gehts auch früher oder später wieder hoch.

09.07.2009 - 08:22 Uhr

SqlCe unterstützt nach meinem Wissensstand auch keine mehrfachbefehle.

Wenn dem so ist, ist die CE vom Befehlssatz her ja nicht identisch mit seinem grossen Bruder. Wäre schade.

Als Alternative kann aber immer noch eine Express Edition installiert werden.

09.07.2009 - 08:07 Uhr

die abfrage von @di auf ? geändern und es klappt.

Genau das war der Knackpunkt. Diese Parameter mit dem @ funktionieren beim SqlCommand

09.07.2009 - 07:58 Uhr

Wieiviel User greifen denn möglicherweise gleichzeitig auf die DB zu. Wenn du nur im SingleUser arbeitest, brauchst du dir auch keine Gedanke um Transaktionen zu machen. Mein Wissensstand zu Access ist eh folgender:[*Keine Transaktionen *Keine mehrfachen Befehle in einem Command *Keine Stored Procedures *Schwerliche Netzwerkunterstüzung

Also wenns geht, dann steig, wie ja auch schon vorgeschlagen wurde, auf MSSQL Compact um. Dann sind alle Probleme wir von Geisterhand verschwunden. (und nutze dort die SqlConnection anstatt von OleDbConnection)

Edit: Tag vergessen

07.07.2009 - 14:00 Uhr

Wird das Programm nur sporadisch genutzt und werden nur relativ wenige Bilder verwaltet, so dass es einfacher ist das Ganze bei Bedarf zu starten statt permanent einen Server laufen zu lassen?

Es wäre aber imho praktischer zu handhaben aus Programmiersicht. Der Hintergrunddienst (Server) muss ja nicht permanent laufen, sondern kann ja auch beim Start vom Client gegebenfalls einfach gestartet werden, falls er nicht läuft (die Rechte vorausgesetzt).

WCF kommt als Kommunikationsgrundlage nicht in Frage, weil das Projekt auf .NET 2 festgelegt ist.

Dann lass es doch auf Remoting. Ist doch super dafür geeignet.

07.07.2009 - 13:15 Uhr

Ich würde 2 Komponenten entwickeln. Einen Server und einen Client. Der Server muss installiert werden, und die Clients auch. Selbst wenn du nur lokal arbeiten würdest, wären beide Programme sinnvoll.

Als Kommunikation würde ich nach Möglichkeit WCF heranziehen, weil du damit am leichtesten auf Infrastrukturen dich anpassen kannst.

07.07.2009 - 08:44 Uhr

So direkt sehe ich kein Fehler.

Hast du schon mal probiert, dein Security Mode auf None zu setzen. Ich weiss, dass ich in der Vergangenheit auch mal damit Probleme hatte. Allerdings nicht wenn der WCF Server am localhost läuft.

07.07.2009 - 08:10 Uhr

Wir bräuchten schon ein paar nähere Informationen dazu. Welches Binding? Statische Methoden? Locking? ... Zeig mal bitte deinen Kontrakt-Code und die Methoden in der Serverimplementierung (zumindest die Methodenköpfe). Auch die Klassenattribute sind von Bedeutung, genauso wie die eventuellen .config Ausschnitte.

06.07.2009 - 13:49 Uhr
  1. Das Programm macht nichts anderes als ein Webrequest zu sms77
  2. Bei einem Fehler wird dieser einfach in einem try-Catch Block unterdrückt. Pech dann für den Feuerwehrmann, der die SMS kriegen sollte.

Ich denke, da sollte noch einiges an dem Programm getan werden, bevor es in den Einsatz kommen sollte.

06.07.2009 - 11:06 Uhr

Hier mal ein Auszug der dir weiterhelfen dürfte:

public static bool CheckUserAndPassword(string usr, string pwd)
{
    using (DirectoryEntry entry = new DirectoryEntry())
    {
        entry.Username = usr;
        entry.Password = pwd;

        DirectorySearcher searcher = new DirectorySearcher(entry);

        searcher.Filter = "(objectclass=user)";

        try
        {
            searcher.FindOne();
            return true;
        }
        catch (COMException ex)
        {
            if (ex.ErrorCode == -2147023570)
                return false;
            else
                throw;
        }
    }
}
06.07.2009 - 07:52 Uhr

Die Sache mit Klassen habe ich anders gemeint, nämlich dass der Client nicht nur Methoden aufrufen kann, sondern auch z.B. Properties lesen/schreiben. Aber das ist ja anscheinend bei SOAP nicht der Fall.

Das stimmt, Web Services bieten nur Methoden an. Das können aber natürlich auch leicht GetX und SetX Methoden sein, womit du deine Properties dann letztlich emuliert hast.

.NET eigene Konstrukte kann man sowieso nicht verwenden (als Parameter oder Rückgabewert).

Was sind für dich .NET eigene Konstrukte. Als Parameter (sowohl Übergabeparameter als auch Rückgabewerte) kann alles genutzt werden, das serialisierbar ist.

03.07.2009 - 08:57 Uhr

Würds auch so machen wie Rainbird, mit einem Remoting oder WCF Server.

Der Server muss natürlich auch noch irgendwie mitkriegen, wann sich die Daten in der DB ändern, damit er weiss, wann die clients benachrichtigt werden sollen.

Interessant in dem Zusammenhang dürft der SqlDependency Thread sein. Da wird am Server ein Event ausgelöst, sobald sich die zugrunde liegende Datenmeng in der DB ändert. Das erspart dir lästiges Pollen.

03.07.2009 - 08:15 Uhr

Deine Vorgehen bei diesem Projekt ist echt lobenswert. Das Ding ist wirklich genial.

Danke auch für die Umstellung .NET 2.0

02.07.2009 - 11:14 Uhr

Danke Christian. Irgendwann kapier ich diese Lamda Expressions auch 😃

die Komponenten geht doch aber unter .net 2.0 gar nicht.

Warum sollte sie nicht gehen, wenn man die ganzen Lambda Ausdrücke durch anonyme Methoden ersetzt. Oder werden noch Klassen benutzt, die in 2.0 nicht enthalten sind?

01.07.2009 - 09:08 Uhr

Also Christian, ich bin wirklich begeistert von deiner Implementierung. Das scheint mir bis jetzt die flexibelste SplashScreen Komponente zu sein, die ich bislang gefunden hab...

Allerdings bin ich grossteils noch in .NET 2.0 unterwegs, und kenne mich deswegen überhaupt nicht mit diesen Lambda Expressions aus. Und nach 45 Minuten Sucherei im Web hab ich's jetzt aufgegeben. Ich krieg dein Beispiel einfach nicht umgebogen, damit es mit anonymen Methoden hinhaut.

Kanns einer mir bischen unter die Arme greifen, denn ich blick diese Lambda Expressions wirklich nicht.

z.B. hier:

spl.EnqueueJob((s) =>
{
    AddTaskAndWait(s, "Initializing", 10, 2 * f);
}, JobMode.Synchronous, Guid.Empty);
30.06.2009 - 14:01 Uhr

Aber meine Frage jetzt lautet ja wie kan ich mir einn Screenshot von einem anderen Rechner holen???

Das ist eine neue Frage und hat nichts mehr mit Fernwartung zu tun. Zum Fernwarten wurden genügend Tools gepostet oder verlinkt. Ich bezweifele, dass du ohne immensen Aufwand auch nur annähernd an eine gebotene Funktionalität von z.B. Teamviewer herankommst.

Dennoch zu deiner Frage:
Du brauchst wohl einen Server der lokal läuft unter dem Benutzerkonto des eingeloggten Users, da du sonst nicht so einfach an dessen Desktop herankommst. Und jedes Programm das unter dem Account des eingeloggten Users läuft, kann auch vom Selbigen gekillt werden. Eventuell hilft ein Windows Dienst unter dem System Account mit Desktopinteraktion, um an den Desktop zu kommen. Ich glaube aber dass das unter Vista wiederrum Probleme bereitet.

Die Frage wurde schon einmal gestellt, und eine Antwort von dir steht noch aus: Was willst du eigentlich erreichen? Administrative Operationen am Client ausführen oder einfach dich nur in dessen Session einklinken?

29.06.2009 - 09:52 Uhr

RDP ist wesentlich schneller als VNC, funktioniert aber nur unter Windows (Es gibt zwar Viewer für Linux, aber der zu steuernde PC muss ein Windows-PC sein).

Ist aber nicht immer die gewünschte Lösung!
Zumindest unter XP wird bei einem RDP der aktuelle eingeloggte User auf dem Client ausgeloggt. Das ist nicht immer wünschenswert. Unt über Firewallgrenzen hinweg mach VNC auch Probleme.

Von VNC würde ich persönlich allerdings auch abraten. Ich tendiere eher zum TeamViewer.

29.06.2009 - 09:39 Uhr

Das ist SQL eigentlich standardmäßig.

Nein, ist es nicht, sondern, wie mein Vorredner Xynratron schon schireb, ist das Collation spezifisch.

26.06.2009 - 14:00 Uhr

Inwiefern sind da Sessions im Spiel?

Durch den Hash wird der User authentifiziert, und der Server lädt die vordefinierten Rechte aus einer Datenbank für den authentifizierten Benutzer, und legt diese in einem Dictionary ab. Das Laden der Rechte ist ein recht aufwändiger Prozess, bei dem viele Faktoren mitspielen, und kann sogar an dynamische Bedingungen anknüpfe, die mittels eines Plugin Systems mit berücksichtigt werden. Dieses Laden der Benutzerrechte dauert in der Regel zwischen 1 und 2 Sekunden. Das beinhaltet auch das Authentifizieren des Benutzers über seinen Hash mittels einer COM Bibliothek.

Sind die Rechte aber einmal in der Dictionary geladen, so kann der Client schnell über ein CheckPolicy den Server abfragen, ob der authentifzierte User ein gewisses Recht hat oder nicht, indem der Server einfach in der vorgehaltenen Dictionary nachschaut. Un da sehr viele CheckPolicy durhcgeführt werden, würde das ständige Neuauthentifizieren und Nachladen aus der DB zu sehr auf die Performance drücken.

26.06.2009 - 13:37 Uhr

Das Ganze ist mir eine recht difficile Thematik. Von HPC hab ich zwar vorher noch nie was gehört, scheint aber auch für uns hier auszuscheiden, da wohl ein Windows 2008 dienen muss, wir jedoch noch auf Windows 2003 setzen. Das ändert sich zwar höchstwahrscheinlich in den nächsten 12 Monaten, aber sicher ist das noch nicht.

Ich hab vorhin schonmal einen Beitrag hier geantwortert, der taucht aber nicht mehr auf. Deshalb gerne nochmal: Da der Service keine prozesskritischen Arbeiten ausführen muss, sondern nur dafür gedacht ist, einen Fingerprint Hash zu erhalten und daraus den User zu ermitteln, und dann die Rechte für eine gegebene Anwendung kontrolliert, ist das insofern nicht weiter kritisch, wenn der Server mal gestoppt wird. Den Client kann ich ja problemlos so aufbauen, dass der Anwender sich halt nochmalsauthentifizieren muss. Das its ja in 2 Sekunden erledigt. Und mehr Daten muss der WCF Server in diesem Fall nicht verwalten. Das Auslesen der Rechte ist zwar eine recht komlexe Thematik, aber als einziger Input dafür ist die ApplicationId und eine Fingerprint Hash nötig. Und wie gesagt, die kann der Client gegegenfalls ja nochmals liefern. Eine neue Fingerprintentnahme ist noch nicht mal zwingend notwendig, wenn sich der Client selbst den Hash merkt.

Dieses HPC schau ich mir aber auf jeden Fall trotzdem mal an, falls mal ein Wechsel auf Win2008 ansteht. Also vielen Dank für den Link zum PDF.

26.06.2009 - 10:42 Uhr

Ich hätte da mal ein grundsätzliches Problem.

Ich bin in letzter Zeit immer mehr in Genuss von WCF gekommen, bin davon begeistert. Jetzt steh ich aber kurz vor dem Problem, dass ich den WCF Server updaten muss (kleiner Bugfix und es kommt eine neue Methode hinzu). Grundsätzlich ist das kein Problem, allerdings laufen wir im 24/24 Modus, und es können permament zahlreiche Anwendungen an dem WCF Service gebunden sein. Wenn ich jetzt den WCF update, muss ich dafür den Windows Service stoppen, in dem der WCF Server gehostet ist, meine Dateien updaten, und den Server wieder starten. Dadurch werden aber sämtliche offenen Sessions unbrauchbar, und die Clients legen sich auf die Nase. Ich könnte natürlich ein neues Connect beim Client durchführen, dadurch sind meine bestehenden serverseitigen Parameter aber flöten.

Wie geh ich da am besten vor, ohne jetzt extra einen riesen Aufwand für irgendwelche Recovery Massnahmen zu betreiben?

26.06.2009 - 10:35 Uhr

maxBufferPoolSize geht auch schinbar nur in der basichHttp-Bindung

Ach so? Und jetzt, wo du's sagst, hatte ich das Beispiel auch aus einem basicHttpBinding genommen. Ich hatte da nämlich dasselbe Problem und konnte es so lösen. Bei wsHttp kann ich dir so direkt auch nicht weiterhelfen.

26.06.2009 - 09:59 Uhr

Versuche mal, im Config File einige Binding Parameter zu erhöhen:

maxBufferSize="200000000" maxReceivedMessageSize="200000000" maxBufferPoolSize="200000000"

maxBufferPoolSize hast du ja schon drin stehen, versuch mal die anderen zu ergänzen.

24.06.2009 - 15:09 Uhr

Ich hab das Beispiel mal erweitert um diese Queue Geschichte.

24.06.2009 - 13:31 Uhr

Hast du da vl ein Codebeispiel oder ein kleines Projekt herumliegen dass ich mir anschaun könnte (WCF Server).

Ich hab mal ein simples blödes WCF Programm angehängt. Vielleicht kommst du ja damit relativ schnell klar und kannst es an deine Bedürfnisse anpassen.

Was das Beispiel jedoch nicht beinhaltet ist die globale und threadsichere Queue im WCF Server

24.06.2009 - 11:01 Uhr

Wenn man eine Transaktion macht hab ich festgestellt geht das ganze ja deutlich schneller

Weil eben nicht jedesmal automatisch neu eine Transaktion gestartet wird und committed wird, sondern du für den ganzen Durchlauf dieselbs Transaktion benutzt.

Aber VORSICHT: Achte darauf dass du dir keine Locks einfängst, denn wenn eine Transaktion recht lange offen ist, kann es dir passieren, dass während der Zeit noch nicht einmal mehr ein Select auf die betroffene Tabelle klappt, geschweige denn Inserts oder Updates von anderen Clients aus.

Dann wird ja immer die ganze Tabelle neu in die DB geschreiben oder? Geht das irgendwie dass nur die neuen Teile hineingeschrieben werden weil bei ein Paar millionen Datensätzen die ich dann mal haben werde dauert das schön lang wenn ich da was ändern will.

Ich an deiner Stelle würde überhaupt garnicht erst mit DataSet anfangen, sondern einfach direkt über ein SqlCommand Befehl den native SQL Befehl an die DB schicken (Insert into ...), und lediglich mit CommandParametern arbeiten.

Meine persönliche Vorgehensweise wäre immer noch der WCF Server, der die Insert Befehle aus einer Queue heraus einen nach dem anderen absetzt. Damit kompensierst du wunderbar den Traffic bei Spitzenzeiten, und du musst dir als Client keine Gedanken mehr über Performance machen.

19.06.2009 - 14:10 Uhr

Ich sag ja auch nicht, dass man keine Seriennummerüberprüfung durchführen darf oder soll, sondern ich wehre mich einfach gegen Machinengebundene Lizenzkeys.

19.06.2009 - 11:58 Uhr

Und noch gar nicht erwähnt ist die Problematik die entsteht, wenn du dir neue Hardware kaufst (sei es nur eine neue Festplatte), und du dann einen neuen Lizenzschlüssel brauchst, es dann aber plötzlich den kleinen Entwickler von nebenan nicht mehr gibt. Dann bleib ich auf ehrlich gekaufter Software sitzen, kann sie aber nicht mehr nutzen weil es den Entwickler nicht mehr gibt der mir, wie er vor 2 Jahre zware versprochen hat, keinen neuen Key mehr geben kann.

Ich hasse dieses Lizenzmodell wirklich. Ich habe nichts gegen eine Überprüfung einer Lizenz, aber bitte nicht maschinengebunden. Ein Serial reicht völlig aus. Denn die wenigste Shareware Software ist es wert, sie dermassen schützen zu wollen. Und wenn doch, dann gibt es sicherlich immer noch mehr ehrliche Käufer als Unehrliche die sich sofort nach Runterladen der Trial auf die Suche nach einem Crack machen. Das beweist nur, dass man es sowieso niemals sicher hinkriegen wird, es verlagert und ershcwert nur die Thematik.

19.06.2009 - 10:08 Uhr

Zu all dem Gesagten, und ohne dass ich das jetzt ausprobiert hätte, aber geht eine solche Anbindung auch unter VB5. Ich bin selbst nicht betroffen davon, und werde auch die nächsten 100 Jahre sicherlich kein VB anfassen, aber wir sitzen hier in dem Fall, dass wir einige VB5 Anwendungen hier laufen haben, und da wäre es interessant zu wissen, ob diese Anbindung auch unter VB5 funktioniert?