Laden...
D
Denny myCSharp.de - Member
Schüler Koblenz Dabei seit 21.05.2004 279 Beiträge
Benutzerbeschreibung

Forenbeiträge von Denny Ingesamt 279 Beiträge

28.02.2005 - 16:30 Uhr

Hallo, einfach das Anführungszeichen oder Apostroph im string verdoppeln.

Besser ist es aber sowieso, wenn du mit Parametern arbeitest, das ist zum einen sicherer und du hast solche Probleme nicht.

27.02.2005 - 18:25 Uhr

Hallo,

wie man eine Mail mit Authentifizierung schicken kann, wurde hier auch schonmal erklärt.

Das ist aber wahrscheinlich nicht das Problem das Threadstarters, da der SMTP-Server ja auf dem lokalen Rechner läuft. Da ist normalerweise keine Authentifizierung nötig.

Eine große hilfe wäre wirklich sich mal die Fehlermeldung anzuschauen, mittels:


catch(Exception x)
            {
                MessageBox.Show(x.InnerException.InnerException.Message);    
            }

27.02.2005 - 16:30 Uhr

Vielleicht hilft dir auch das weiter.

27.02.2005 - 16:22 Uhr

Wenn du die Klammer in Anführungszeichen eingeschlossen hast, sollte sie eigentlich keine Probleme machen. Zeig doch mal deinen SQL-String.

Wenn es sich um eine eckige Klammer handelt, so kannst du diese wiederrum in eckige Klammern einschließen um sie mit einzubeziehen: (nicht '[' sondern '[[]').

27.02.2005 - 16:18 Uhr

Hallo,

ich kann dir sagen, dass es wahrscheinlich nicht an deinem Code liegt, sondern am SMTP-Server selbst.

Schau mal ob dieser richtig konfiguriert ist und auch läuft. Ansonsten versuch mal anstatt 'localhost' beim SMTPServer deine IP-Adresse (127.0.0.1) anzugeben.

//EDIT: Wenn das nicht hilft, schau dir mal die genauere Fehlermeldung an:


catch(Exception x)
            {
                MessageBox.Show(x.InnerException.InnerException.Message);    
            }

09.02.2005 - 15:44 Uhr

Hallo,


string[] dateien = System.IO.Directory.GetFiles("C:\\\\meinOrder");

09.02.2005 - 15:38 Uhr

Wo du den Connectionstring zuweist ist eigentlich relativ egal.

Wichtig ist nur, dass er zugewiesen ist, sobald du die Connection verwenden willst. Am besten weist du ihn also da zu, wo du auch das Connection-Objekt erstellt.
Ob du dann die Eigenschaft für den ConnectionString setzt oder ihn im Konstruktor übergibst ist egal.

09.02.2005 - 15:33 Uhr

Du hast schon Recht mit :

Ich habe angenommen der WebService verarbeitet das Logfile und ich greife mit dem WebFrontend "einfach" darauf zu.

Du kannst das Logfile vom Webservice verarbeiten lassen und in der ASP.NET Anwendung kannst du dann auf die 'vearbeitete' Version zugreifen.

Nehmen wir mal an du machst es ohne Webservice:
Ich weiß nicht wie oft das Logfile geändert wird bzw. es aktualisiert werden muss, aber sagen wir mal, es wird minütlich aktualisiert und deine Anwendung muss bei jeder Anfrage die Daten erneut aus dem File lesen, um auch immer aktuell zu bleiben.
Das sieht dann so aus:

Anfrage -> Daten aus Datei -> verarbeiten -> darstellen

Die Variante mit Webservice wäre dann:

  1. Client: Anfrage an Webservice
  2. Webservice: Daten aus Datei -> verarbeiten -> zum Client schicken
  3. Client: darstellen

Der Webservice müsste ja genauso die Daten immer bei jeder Anfrage aktualisieren.
Nur kommt dann noch die zusätzliche Kommunikation mit dem Client dazu, was dann insgesamt mehr Zeit kostet.

Wenn die Daten aber nicht bei jeder Anfrage unbedingt neu ausgelesen werden müssen, dann kannst du das ganze zb für verschiedene User auch cachen. Das macht dann aber keinen Unterschied ob das in der ASP.NET anwendung oder im Webservice geschieht.

Wenn die Verarbeitung vom Logfile aber sehr sehr aufwändig ist und unter Umständen mehrere Sekunden dauert (was ich mir nicht vorstellen kann), dann könntest du mit dem Webservice auch asynchron kommunizieren. Das heißt der Client wartet nicht, bis er die Daten empfangen hat und ist solange geblockt, sondern der Benutzer kann die Anwendung erstmal wie gewohnt weiterverwenden und erst wenn die Daten wirklich fertig verarbeitet sind, werden sie dargestellt.

Das könntest du aber auch ohne Webservice realisieren. .

09.02.2005 - 15:13 Uhr

Ich verstehe das nun nicht ganz.

Der WebService muss dann doch genau das selbe machen, wie deine ASP.NET Anwendung, nur muss zusätzlich noch mit dieser kommunizieren.

Wo siehst du den Performancevorteil vom WebService, wenn dieser die Arbeit macht anstatt deiner ASP.NET Anwendung?

09.02.2005 - 15:09 Uhr

Soweit ich weiß gibt es außer in Windows Server 2003 keine Möglichkeit das SP einzeln zu entfernen. Du müsstest also das .NET Framework deinstallieren und dann erneut ohne SP1 installieren.

Falls du Win2003 benutzt, sollte das SP1 aber unter dem Namen "KB867460" in deinem Add/Remove Software Dialog stehen.

09.02.2005 - 14:47 Uhr

Hallo,


SqlConnection conn = new SqlConnection();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
DataTable dt = new DataTable();
da.SelectCommand.Connection = conn;

conn.ConnectionString = deinConnectionString;
da.SelectCommand.CommandText = "sql statement";

try
{
	da.Fill(dt,"deine tabelle");					
}
catch (Exception ex)
{
	//Error handling
}
finally 
{
	conn.Close();
}


DropDownList binden:


ddl.DataSource = dt;
ddl.DataTextField = "Die Spalte die gezeigt werden soll";
ddl.DataValueField = "Die Spalte aus der der Wert jedes Items genommen wird" (am besten dein PK);
ddl.DataBind();

09.02.2005 - 14:38 Uhr

Hallo,

wenn du als Frontend sowieso nur eine Web-Applikation verwenden willst, dann brauchst du doch nicht noch einen extra Web-Service.

Du müsstest dann von deiner ASP.NET Anwendung mit dem Webservice kommunizieren der mit der Datenbank/dem Logfile kommuniziert.

Darauf kannst du meiner Meinung nach ohne einen Unterschid direkt von deiner WebApplikation zugreifen, ohne einen Umweg über den Webservice zu machen.

Das ganze sieht natürlich anders aus, wenn du die Daten noch mit anderen Applikation (zb Windows) verarbeiten willst.

08.02.2005 - 15:25 Uhr

Noch eine kleine Anmerkung zu VS:
Falls du es mal testen willst und es nicht zu Produktionszwecken benutzen willst, bekommst du bei MS die Beta-Version von Visual Studio 2005 umsonst zum Download oder auch für 5€ auf DVD zugeschickt.

08.02.2005 - 15:22 Uhr

Ist die 'nr'-Spalte ein int oder ein string (char, varchar, etc)?

Überprüfe doch mal was du bei


ds.Tables["cocktail"].Rows[listBox1.SelectedIndex]["nr"].ToString()

Für einen Wert bekommst und ob dieser in der Alkohol-Tabelle vorhanden ist.

08.02.2005 - 14:31 Uhr

Ich denke, dass es soweit ziemlich richtig ist.
Du kannst nun über das DataRelation-Objekt die Spalte in der alkohol-Tabelle ermitteln:


//Die Spalte die in der Listbox ausgewählt ist, bestimmen und die zugehörige(n) Childrows abfragen
DataRow AlcRow = ds.Tables["cocktail"].Rows[listBox1.SelectedIndex].GetChildRows(dr)[0];
comboBox1.SelectedText = AlcRow["name"].ToString();

Du könntest das aber auch ohne ein DataRelation-Objekt machen, zb. indem du die Select-Methode benutzt:


DataRow AlcRow = ds.Tables["alkohol"].Select("nr = " + ds.Tables["cocktail"].Rows[listBox1.SelectedIndex]["nr"].ToString())[0];
comboBox1.SelectedText = AlcRow["name"].ToString();

08.02.2005 - 14:17 Uhr

Hallo,

schau doch mal hier oder hier rein.

08.02.2005 - 14:14 Uhr

Nur mal ein Tipp am Rande:
Schau dir auch mal den "Logging and Instrumentation Application Block" an.

Über XML-Datien (vllt sogar eigene Klassen als solche serialisiert, je nachdem wie deine Log-Einträge aussehen müssen) hast du beides. Gute Abfragemöglichkeiten und Performance.

08.02.2005 - 14:07 Uhr

Wenn du wirklich über TCP kommunizieren willst, schau dir mal folgendes Beispiel an (abgeändert aus der MSDN)

Server:


//TCPListener warter auf einen Client
TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"),1234);
//Listener starten
listener.Start();
//Unser string, der empfangen werden soll
string data;
//Buffer
byte[] bytes = new byte[256];
			
//Hier werden die Daten empfangen
while(true)
{
	Console.Write("Waiting for a connection... ");
	//Warter, bis ein Client connected und ermöglich Zugriff
	TcpClient client = listener.AcceptTcpClient();
	Console.WriteLine("Connected!");
				
	//string wieder auf null setzen
	data = null;
				
	//Empfängt den Stream vom Client, in dem die Daten übertragen werden
	NetworkStream stream = client.GetStream();
	//Anzahl der gelesenen bytes
	int i;

	//Solange Daten im Stream vorhanden sind und der Client connected ist
	while((i = stream.Read(bytes, 0, bytes.Length)) != 0)
	{
		// Liest die bytes in den buffer
		// Convertiert die bytes im buffer wieder in einen string
		data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
		Console.WriteLine("Received: {0}", data);
					
	}
	// Verbindung zum Client beenden
	client.Close();
	Console.WriteLine("Client disconnected");

}

Client:


//Erstellt einen TcpClient
TcpClient client = new TcpClient();
//Verbindet den Client zu dem angegebenen Endpoint
client.Connect(IPAddress.Parse("127.0.0.1"), 1234);
//Empfängt dem Stream vom Client, in den die Daten geschrieben werden
NetworkStream ns = client.GetStream();
			
//schreibt den string "test" in den buffer
byte[] writebuffer = Encoding.ASCII.GetBytes("test");
//Überträgt die Daten im Stream
ns.Write(writebuffer, 0, writebuffer.Length);
ns.Flush();
			
//Beendet die Übertragung der Daten
ns.Close();

Console.ReadLine();

Das ganze könnte man aber natürlich auch komfortabler über Remoting (dort zum Beispiel mit Events zwischen Client und Server beim Senden von Daten) oder mit reinem Messaging (zb über MSMQ) machen.

08.02.2005 - 13:38 Uhr

Hallo,
du brauchst nicht für beide Tabellen ein DataSet erstellen. Ein DataSet mit 2 DataTables (eine für beide Tabellen) wäre geeigneter.

Wie sind die Tabellen miteinander verknüpft? Welche Spalte(n) der Tabelle mit den Coctails zeigt auf welche Spalte der Tabelle mit den Alkoholsorten?

Mit diesem Wissen kannst du dann ein DataRealtion Objekt des DataSets erstellen, dass diese beiden Spalten miteinander verknüpft.
Über dieses DataRelation-Objekt kannst du dann bequem die Parent- bzw. Childrows zu den Coctails/Alkoholsorten abrufen.

07.02.2005 - 23:45 Uhr

Hallo,
ich zähle mal auf, was mir spontan so einfällt:

  • Webservices sind immer stateless, Remoting-Objekte können hingegen einen Status halten (zb. CAO)
  • Mit Remoting sind auch Peer-to-Peer Applikationen möglich, es muss keinen 'zentralen' Server geben
  • Remoting kann zb Daten auch binär übertragen, Webservices hingegen sind an SOAP gebunden. Binäre Serialisierung kann ich verschiedenen Fällen perfomanter sein.
  • Remoting unterstützt verschiedene Channels (zb. Http, Tcp, aber auch eigene), Webservices müssen hingegen im Kontext von ASP.NET (HTTP) laufen
  • Remoting ist einfach flexibler wenn es um .NET Architektur geht (zb Events über Prozessgrenzen hinweg, flexiblere Möglichkeiten zum Umgang mit .NET Objekten, etc)
  • WebServices sind hingegen -wirklich- plattformunabhängig, da sie nur über SOAP kommunizieren
  • Webservices sind einfacher zu implementieren

Es gibt aber bestimmt noch einige andere Dinge.

Ich würde sagen, man sollte Remoting im Intranet benutzen, wenn mit .NET gearbeitet wird, da es einfach flexibler und teilweise schneller ist.

WebServices sind eher zur Bereitstellung von Daten zum Austausch zwischen Firmen (B2B) oder Bereitstellung für die Öffentlichkeit (Internet) gedacht, da sie volkommen plattforumunabhängig sind. Man kann sie auch im UDDI-Verzeichnis veröffentlichen.

30.01.2005 - 22:47 Uhr

Hallo,

du könntest eine Basisklasse erstellen, die von Form erbt und in der du BarcodeScanned implementierst. Dann leitest du deine anderen Form Klassen von dieser Klasse ab und erstellst in clsBarcodeMessageFilter eine Variablen des Typs der Basisklasse.

Wenn die Implementierung von BarcodeScanned allerdings in jeder Klasse anders sein soll, verwendest du Interfaces:


public interface IMyFrm
	{
		void BarcodeScanned(string barcode);
	}

	public class FrmDatenerfassung : Form, IMyFrm
	{
		// Form...
		public void BarcodeScanned(string barcode)
		{
			//Deine Implementierung
		}
	}
	
	public class clsBarcodeMessageFilter : IMessageFilter
	{
		IMyFrm _fm;

		public bool PreFilterMessage(ref Message m)
		{
			//...
			_fm.BarcodeScanned("test");
			//...
		}
	}

Ich weiß ja nicht, was du genau machen willst. Gegenbenfalls würde es auch einfach reichen die Methode einfach irgendwo statisch zu deklarieren und einfach die aktuelle Form mit zu übergeben. Dann könntest du die Methode aber ja auch direkt in der selben Klasse deklarieren...

30.01.2005 - 17:47 Uhr

Hallo,
ich glaube dafür ist im Framework nichts direkt implementiert.
Entweder du gehst den Umweg über MFC oder du schaust dir mal folgende Sachen an:

dotnetmagic API
docking toolbar
xtra bars

30.01.2005 - 17:24 Uhr

Um PHP und ASP.NET nutzen zu können, müssen ja nicht mehrere Webserver installiert sein, zb kann der IIS auch beides hosten. Anhand des Request kann zwischen den verschiedenen Technologien unterschieden werden.

Es gibt auch einige Anbieter die ASP.NET mit PHP zusammen anbieten (einfach mal bei google suchen). Mit Tomcat kenne ich mich allerdings nicht aus, theoretisch ist es aber möglich, dass alles zusammen (und noch viel mehr) auf einem Server läuft.

Wie schwierig das ganze dann jedoch zu managen ist oder ob Konflikte entstehen, kann ich dir leider nicht sagen.

30.01.2005 - 12:24 Uhr
29.01.2005 - 12:48 Uhr

Hallo,
ich denke dir wird nichts anderes übrig bleiben, als immer den voll qualifizierten Namen der Klasse anzugeben:


private Ein.Namespace.Client.Client client;

Einer Klasse den selben Namen wie dem Namespace zu geben, verstößt gegen die Naming Guidelines für Namespaces

Do not use the same name for a namespace and a class. For example, do not provide both a Debug namespace and a Debug class.

29.01.2005 - 11:57 Uhr

Hallo,
am besten verwendest du die MailMessage Klasse aus dem Namespace
'System.Web.Mail' (vorher nicht vergessen System.Web zu refrenzieren)

Die Verwendung funktioniert folgenermaßen:


DataTable dt = new DataTable("EmailTable");
//Hier die DataTable mit den Daten aus der Datenbank füllen...
//...

System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
//Absender und Betreff festlegen
mail.From = "deineemailadresse";
mail.Subject = "deinbetreff";
//Den text der spalte 'mailbody' aus der 1. zeile der Tabelle als body hinzufügen
mail.Body = dt.Rows[0]["mailbody"].ToString();
//Den text der spalte "mailto" aus der 1. zeile der Tabelle als Empfänger hinzufügen
mail.To = dt.Rows[0]["mailto"].ToString();
			
//Falls du dich beim smtp server authentifizieren musst

mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
//Der SMTP-Benutzer
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "myUsername");
//Das SMTP-Passwort	
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "myPassword");
			
//SMTP server festlegen
System.Web.Mail.SmtpMail.SmtpServer = "deinsmtpserver";
//Mail senden
System.Web.Mail.SmtpMail.Send(mail);

29.01.2005 - 10:02 Uhr

In VS2005 ist ein Tool zum verwalten der SQL-Server-Datenbanken eingebaut. du kannst Tabellen grafisch bearbeiten, löschen, Stored Procedures Hinzufügen und vieles mehr.

Beim SQL-Server ist ja sonst das SQL Server Management Studio (2005) oder der Enterprise Manager dabei..
Für SQL 2005 Express gibt es zudem den Sql Server 2005 Express Manager
Wie es allerdings bei den anderen Express Editions / MSDE aussieht weiß ich jetzt nicht.
Da wird dir vllt nichts anderes übrig bleiben als die Befehle über VS oder osql manuell gegen die DB auszuführen.

Oder du suchst dir ein Drittanbieter Tool (davon sollte es genug geben).
Einfach mal nach sql server management tool bei Google suchen.

28.01.2005 - 13:05 Uhr

Meinst du Bücher mit allgemeinen Grundlagen zu TCP/IP und deren Programmierung oder speziell die Programmierung mit C#?

Wenn C#:
Klick

27.01.2005 - 15:48 Uhr

Änder mal die Konfigurationsdatei (web.config) deiner Webapplikation.

authentication mode="Keine"

zu:

authentication mode="none" oder authentication mode=""windows" (integrierte Windows-Authentifizierung)

26.01.2005 - 20:47 Uhr

Wenn du Visual Studio benutzt, kannst du das Bild zum Projekt hinzufügen und dann unter dessen Eigenschaften "Buildaktion" auf "Eingebettete Ressource" stellen.
Damit ist das Bild als Ressource in der Assembly integriert.
Abrufen kannst du es dann folgendermaßen:


System.Reflection.Assembly  currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
using (System.IO.Stream stream = currentAssembly.GetManifestResourceStream("deinNamespace.bild.jpg"))
{
	Image img = Image.FromStream(stream);
}

26.01.2005 - 16:39 Uhr

Dann habe ich keine Ahnung...

Du könntest aus reinen Testzwecken mal versuchen den SQL-Server auf einem anderen Port laufen zu lassen, um dann im Connectionstring IP,Port anzugeben.

Was für ein Betriebssystem verwendest du auf dem Rechner mit dem SQL Server?

26.01.2005 - 16:32 Uhr

Über den lokalen PC kannst du problemlos mit dem testuser connecten?
Benutzt du eine name instance des sql servers oder ist es der default server?

26.01.2005 - 16:04 Uhr

Wie sind der PocketPc und dein lokaler PC denn verbunden?
Sicher dass die Verbindung in Ordnung ist?

Ansonsten versuch mal folgendes:
DeinSqlServerVerzeichnis\80\Tools\Binn\SVRNETCN.exe -> dort TCP/IP aktivieren.

26.01.2005 - 15:29 Uhr

Hallo,
habe zwar nicht soviel Ahnung von Pocket Pc's, würde aber stark vermuten, dass es an deinem Connection String liegt.
user id sollte nur angegeben werden, wenn es sich um einen wirklichen sql-benutzer handelt. Für integrierte Authentifizierung verwendest du:
"Integrated Security=SSPI"

Versuch es mal so:


String strConnection = "sever=192.168.99.106;packet size=4096;user id= test; pwd=test; persist security info=False;database=Patienten";

26.01.2005 - 14:18 Uhr

Du hast hier einen Namespace (xmlns:xxx) für den xlink-Prefix erstellt. Dieser ist unter allen elementen des TestSuite-Tags gültig und kann verwendet werden (sowohl bei Attributen als auch bei Tagnamen).

Ein XML-Namespace hat den Nutzen, dass man Elemente im Dokuement eindeutig identifizieren kann. Es könnten ja zum Beispiel mehrere Elemente oder Attribute den gleichen Namen besitzen aber trotzdem einen volkommen unterschiedlichen Sinn haben oder ineinander verschaltet sein.

Die Adresse hinter dem Namespace muss nicht unbedingt eine URL sein, sondern ein URI jeglicher Art. Er muss neu eindeutig sein (aus diesem Grund eignet sich die url der -eigenen- Homepage eben besonders gut).

Oftmals befindet sich hinter Namespaces aber auch mehr als nur der Zweck der Eindeutigkeit, zb sind dahinter oft XSD-Dateien, die das Schema der Elemente bestimmen, die mit diesem Namespace gekennzeichnet sind.

Wenn .NET das Namespace-Prefix nicht bekannt ist (es also nirgends deklariert wird), wird wahrscheinlich der von dir oben genannte Fehler ausgegeben.

25.01.2005 - 21:35 Uhr

Hallo,
das gehört eigentlich ins ASP.NET Forum, aber zu deinem Problem:

Nach dem ButtonClick wird ein Postback ausgeführt, die Seite wird also komplett neu geladen und damit auch der Code in der Page_Load Methode ausgeführt.
Wenn du dort erst die TextBox erstellt oder ihr einen Wert zuweist, wird dies immer wiederholt wenn ein Postback ausgeführt wird.

Du solltest also in der Page_Load Methode immer vorher überprüfen ob es sich um ein Postback handelt, mittels:


if(Page.IsPostback)
{
     //...
}

25.01.2005 - 20:44 Uhr

Nur wenn der Wert auf Auto-Inkrement gestellt ist oder einen Default-Wert besitzt (was bei einem PK natürlich sehr viel Sinn macht), wird die Zelle automatisch ausgefüllt, wenn kein Wert mit übergeben wird.

Du müsstest dann also die Spalteneinstellungen ändern, sodass sie zb. automatisch inkrementiert wird, ansonsten musst du explizit für jeden Wert eine ID mit angeben. Dazu eignen sich, wie Noodles schon gesagt hat, Guids am besten.
Natürlich muss dazu auch der Datentyp der Spalte stimmten (uniqueidentifier).

Ansonsten besteht noch die Möglichkeit sich zb über einen out-Parameter die zuletzt eingefügt ID mittels @@Identity zurückgeben zu lassen. Diese könnte man dann zb von Hand inkrementieren oder anders verändern.

25.01.2005 - 20:38 Uhr

Hallo,
versuch es mal mit:


Frm_tagebuch myChild = new Frm_tagebuch();

// ....

private void zeigenToolStripMenuItem_Click(object sender, EventArgs e)
{
  myChild.MdiParent = this;
  myChild.Show();
}

Die Parent-Eigenschaft gibt das übergeordnete Control (was auch nicht unbedingt eine Form sein muss) an. Du befindest dich aber ja schon in der aktuellen Form-Instanz.

25.01.2005 - 16:40 Uhr

Hallo,
versuch es mal so:


XmlElement xele = xdoc.CreateElement("Event");
xele.Attributes.Append(xdoc.CreateAttribute("xlink:","to",null)).Value = E.Label;
xele.SetAttribute("Content",E.Code);

25.01.2005 - 15:37 Uhr

Du hast in VS ja den Eigenschaftsinspektor im Entwurfsmodus (wenn nicht, F4 drücken).
Dort ist neben dem Eigenschaften-Button ein Button für die Ereignisse des Controls, das ausgewählt ist. Da kannst du sie also bequem zuweisen.

Oder du schreibst es eben manuell in den Code (gibt ja noch IntelliSense, auswendig muss es also nicht sein).

25.01.2005 - 15:29 Uhr

Hallo,

habe zwar noch nicht mit dem AD in Web-Services gearbeitet, kann dir aber sagen, wie die Authentifizierung/Autorisierung mit WSE funktioniert.
für die Beispiel brauchst du folgende Namespaces:


using Microsoft.Web.Services2.Security.Tokens;
using Microsoft.Web.Services2.Security;
using Microsoft.Web.Services2;
using System.Security.Permissions;

In deinem Client fügst du dem SoapContext ein UserName-Token mit deinen Credentials hinzu:


// Auf den Soap-Context der Request-Message zugreifen
SoapContext myContext = myservice.RequestSoapContext;
			
//UserName-Token definieren
UsernameToken myNameToken = new UsernameToken("denny", "asdf", PasswordOption.SendHashed);

try
{
	// Das Token zur Token-Collection hinzufügen
	myContext.Security.Tokens.Add(myNameToken);

	// WebService Aufrufe...
	//...
}
catch(Exception ex)
{
	//error handling
}

Auf deinem Server fragst du dann die Security-Elemente der SOAP-Message ab. Zum Beispiel mit dieser Methode (aus der MSDN):


private UsernameToken GetBodySigningToken(SoapContext requestContext)
{
	UsernameToken token = null;
	foreach (ISecurityElement securityElement in requestContext.Security.Elements)
	{
		if (securityElement is MessageSignature)
		{
			MessageSignature sig = (MessageSignature)securityElement;
			if ((sig.SignatureOptions &
				SignatureOptions.IncludeSoapBody) != 0)
			{
				SecurityToken sigToken = sig.SigningToken;
				if (sigToken is UsernameToken)
					token = (UsernameToken)sigToken;
			}
		}
	}
	return token;
}

Wenn du das Username-Token wieder erhalten hast, prüfst du es mit einem UsernameTokenManager. Dieser prüft normalerweise nur gegen das Windows-Login, für das AD musst du deshalb einen eigenen implementieren (siehe weiter unten):


UsernameToken token = GetBodySigningToken(RequestSoapContext.Current);
MyUsernameTokenManager manager = new MyUsernameTokenManager();
manager.VerifyToken(token);

Wenn der Bnutzer nicht authentifiziert werden konnte, wird eine Exception ausgelöst.
Die Verify-Methode ruft intern die AuthenticateToken-Methode auf, die das Password für den benötigten User überprüft -> Dies musst du also selbst implementieren:


[SecurityPermission(SecurityAction.Demand,   
Flags= SecurityPermissionFlag.UnmanagedCode)]
public class MyUsernameTokenManager : UsernameTokenManager
{
	protected override string AuthenticateToken(UsernameToken token)
	{
		if (token == null) 
			throw new ArgumentNullException();

		// Das Password für den UserName überprüfen (manuelle implementieren)
		string myPwd = GetPassword(token.Username);
		return myPwd;
	}

}

(SecurityPermissionFlag.UnmanagedCode wurde hier nur benutzt um mögliche Angreifer abzuwehren, weil nur sehr vertrauenswürdige Assemblys (wie zb WSE) die Berechtigung haben unmanaged Code aufzurufen, ist aber natürlich nicht nörig)

Die Klasse gibt also das benötigte Password zurück, wessen Hash, dann mit dem Hash des übermittelten Password verglichen wird (ist auch noch eine TimeStamp-Komponente mit drin soweit ich weiß)

Zuletzt musst du dann noch deinen eigenen TokenManager WSE bekannt machen.
Die WSE-Settings aufrufen -> Security -> Security Token Manager -> hinzufügen -> Datein eingeben (als QName "wsse:UsernameToken").

25.01.2005 - 14:12 Uhr

Hallo,

ich hoffe ich habe das richtig verstanden und du redest von einem typisierten DataSet, dass du dir vom Assistenten hast erstellen lassen.

Das Schema dieses DataSet wird als .xsd, also als XML-Schema - Datei gespeichert.
Du müsstest diese Datei also manuell editieren oder dir auf Basis der neuen Tabelle ein neues Schema erstellen lassen.

24.01.2005 - 20:33 Uhr

Es geht auf jeden Fall, wenn du die Klasse aus der selben Assembly in beiden Projekt verwendest.

Entweder referenzierst du also das eine Projekt in dem anderen oder du packst die Klasse in eine eigene Assembly, wie talla schon vorgeschlagen hat.

24.01.2005 - 20:04 Uhr

Ja, sicher 😃
msmask32.ocx

24.01.2005 - 19:34 Uhr

Hallo,
um den Wert einer TextBox zu validieren kannst du zb. reguläre Ausdrücke verwenden.
Ein paar Informationen dazu findest du hier oder hier in der MSDN.

Für eine IP-Textbox könntest du aber zb auch das Masked-Control von MS verwenden.
In der Toolbox gehst du dazu auf "Elemente hinzufügen" und wählst aus der Registerkarte COM-Komponenten das "Microsoft Masked Edit Control" aus.
Das ziehst du dann auf deine Form und weist ihm folgendes zu:


editcontrol.Mask = "###.###.###.###";
editcontrol.Text = "000.000.000.000";

24.01.2005 - 19:20 Uhr

Was kommt denn genau für eine Fehlermeldung?
Hast du es schonmal mit was anderem als binärer Serialisierung verscht (Xml?)?
Zeig doch mal den Code deiner eigenen Klasse.

Zur DataTable:
Wenn du diese mit einem BinaryFormatter serialisierst, dann ist es trotzdem XML-Format, du ziehst also überhaupt keinen Nutzen aus der binären Serialisierung, im Gegenteil die Datei wird oftmals sogar noch größer. Du kannst dir eine binär serialisierte DataTable ja mal als Datei anschauen.
Wiegesagt wurde das im .NET Framework 2.0 nun verbessert.

24.01.2005 - 18:14 Uhr

Hallo,

die CPU-Geschwindigkeit kannst du folgendermaßen über WMI ermitteln:


public static uint GetProcessorSpeed()
{
	// Win32_Processor-Instanz für den ersten Prozessor erzeugen und die
	// Geschwindigkeit abfragen
	ManagementObject mo = new ManagementObject(
		"Win32_Processor.DeviceID='CPU0'");
			
	uint currentClockSpeed = 0;
	try
	{
		currentClockSpeed = (uint)(mo["CurrentClockSpeed"]);
	}
	catch {}
	// Speicher des WMI-Objekts freigeben
	mo.Dispose();
	return currentClockSpeed;
}

Die CPU-Temperatur kann man glaube ich auch über WMI ermitteln, soweit ich mich erinnere muss dies dein Mainboard-Treiber aber explizit unterstützen.
Dann sollte es folgenermaßen funktionieren: (nicht getestet)


public static void CPUTemp()
{

	SelectQuery myQuery = new SelectQuery("SELECT * from " +
		"Win32_TemperatureProbe");
	ManagementObjectSearcher mySearcher = new ManagementObjectSearcher(myQuery);
			
	foreach (ManagementBaseObject obj in mySearcher.Get())
	{

		MessageBox.Show(("Temp: " + obj["CurrentReading"]));

	} 
	mySearcher.Dispose();
}

Nicht vergessen vorher System.Management zu referenzieren und einzubinden.

24.01.2005 - 15:00 Uhr

Ah, tut mir Leid, habe dich falsch verstanden.
Ich dachte du wolltest mit Schlüsseln in der Registry arbeiten..

Schau doch mal hier rein.

24.01.2005 - 14:37 Uhr

Hallo,

Schau dir mal den Namespace Microsoft.Win32.RegistryKey an.
Zum Beispiel hier in der MSDN

24.01.2005 - 14:34 Uhr

Original von Guggsdu

Original von Denny
In .NET 1.x kann man eine DataTable bzw. DataSet doch gar nicht wirklich binär serialisieren oder täusche ich mich da?

--> Da täuschst Du Dich tatsächlich. Man kann eine DataTable sehr wohl binär serialisieren!

Gruß
Guggsdu

Könntest du mir dazu ein Codebeispiel geben oder mir die binäre DataTable zeigen? Dachte bis heute, dass es nicht geht.