Laden...
Avatar #avatar-2678.jpg
Tomot myCSharp.de - Member
Junior-Softwaredeveloper C# und ASP.Net Düsseldorf Dabei seit 21.12.2007 691 Beiträge
Benutzerbeschreibung

Forenbeiträge von Tomot Ingesamt 691 Beiträge

12.06.2009 - 08:53 Uhr

@Tomot:
Wie kriegt man die Unterschiede raus? Kann man die Datenbank beliebig ändern und ein Differenzscript aus 2 Skripten machen?

Wenn du z.B. eine Spalte hinzufügt, dann wird ein SQL Skript generiert, das diese Operation in einem SQL Command darstellt. In diesem Skript kannst du nun natürlich noch andere hinzufügen, wie z.B. Insert Befehle.

Ein Differenzscript kann bei manchen Situationen nicht ausreichend sein. So z.B. wenn du eine Spalte hinzufügst, sie mit Werten füllst und ihr danach das Attribut NOT NULL gibst. Bei der Generierung eines Differenzskriptes würde dann das Inserting fehlen und du Probleme beim vergeben des NOT NULL Attributes bekommen.

Und wenn du jetzt sagst, dass es dir eventuell zu viele Änderungsskripte werden, dann solltest du dein DB-Desing gründlich überdenken/erweitern, bevor du Änderungen durchführst.

12.06.2009 - 01:22 Uhr

Lass dir doch vom Management Studio die Änderungsskripte generieren. Die sammelst du zwischen den einzelnen Versionen und führst sie dann nach und nach aus. Du kannst auch irgendwo nen Haken setzen, das der "Wollen Sie das Änderungsskript speichern" Dialog standardmäßig erscheint.

10.06.2009 - 10:27 Uhr

Benutze mal IComparer direkt als Interface

10.06.2009 - 09:24 Uhr

Ich habs nun doch gelöst bekommen, wie ich ursprünglich wollte. Mit den Worten "zweite LinqDataSource" und Lambda Expressions habe ich etwas gesagt, das ich hierfür gar nicht brauche.
Die LinqDataSource verwendet ja einen DataContext. Wenn ich nun auf einen referenzierten Wert innerhalb dieses DataContextes zugreifen will (beide Tabellen liegen im gleichen DataContext), dann kann ich es über solch eine Konstruktion:

<asp:Literal ID="litKategorie" runat="server" Text='<%# Eval("DownloadKategorie.Kategorie") %>' />
09.06.2009 - 14:32 Uhr

Hi Peter,
danke dir.
Dann werde ich das anders über entsprechende Events (RowDataBind oder was mir in dem Kontext zur Verfügung steht) lösen.

09.06.2009 - 11:24 Uhr

Hi Leute,
ich stehe gerade an der Stelle, das ich ein Gridview mit einer LinqDataSource befülle.
In einer Spalte benötige ich nun jedoch Werte aus einer anderen LinqDataSource (hier referenzieren sich die SQL Tabellen)

Im EditItemTemplate funktioniert dies problemlos. Nun will ich im ItemTemplate jedoch, das ich für den Integer-Wert aus der Spalte "Kategorie" den Anzeigenamen aus der LinqDataSource ldsKategorie erhalte.

        <asp:TemplateField HeaderText="Kategorie">
            <EditItemTemplate>
                <asp:DropDownList ID="ddlEditKategorie" runat="server"
                 DataSourceID="ldsKategorie" DataTextField="Kategorie" DataValueField="KategoryID" SelectedValue='<%# Bind("Kategorie") %>'></asp:DropDownList>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Literal ID="litKategorie" runat="server" Text='<%# Bind("Kategorie") %>' />
            </ItemTemplate>
        </asp:TemplateField>

Pseudocode:


 text = Eval("(from q in ldsKateogrie where KategoryID == " + Bind("Kategorie") + "select q.Kategorie).First()");

Vermutlich wäre dann hier eine passende Lamda-Expression die Lösung.
Daher die Frage, geht mein Vorhaben überhaupt? Ich meine soetwas schon einmal gesehen zu haben.
Meine Googleversuche haben mich leider auch nicht weitergebracht. Hat mein Vorhaben einen speziellen Namen? Weil es "asp.net using linq in markup" oder ähnliche leider nicht sind.

Über Tipps oder Hilfestellungen wäre ich dankbar 😉

[edit] Titel geändert

02.06.2009 - 18:48 Uhr

mit einem button löse ich ja normalerweise so nen postback aus. Wenn dieses button anstatt ein postback eine javascript funktion aufruft, habe ich ja gar keine andere wahl als so ein postback manuell auszulösen.

Validierst du denn zusätzlich auch serverseitig? Hast du an dieser Stelle den CustomValidator und das Page.IsValid schon ausgereizt?

01.06.2009 - 17:08 Uhr

Hi

weil ich auf dem WebServer keine Dateien zwischenspeichern kann/ darf, d.h. ich möchte wirklich nur den Inhalt der Datei auslesen

Probiere es dochmal mit dem FileUpload und benutze dann den MemoryStream, den der Fileupload als Property bereitstellt.

30.05.2009 - 16:33 Uhr

Hi,
ich denke das dies nicht klappt, da die List<T> Klasse nicht als partial deklariert wurde.
MSDN: List<T> Class

[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable

Ich würde es an dieser Stelle mit einer ExtensionMethod versuchen

29.05.2009 - 23:12 Uhr

D.h. sobald ein Element mit dem Attribut "runat" versehen wurde, lässt sich ausnahmslos auf alle darin verschachtelten Elemente zugreifen? Kann man das so pauschal sagen?

29.05.2009 - 21:26 Uhr

Hi Peter Bucher

Nein, ohne runat="server" kannst du das Element überhaupt nicht ansprechen, auch nicht mit FindControl()

Also ich habe eine Masterpage, in der unter anderem folgener Code steht:


<head runat="server">
    <title id="mTitle"></title>
    <link rel="stylesheet" href="~/styles/wiki.css"  type="text/css" />
</head>

Wenn ich nun über die MasterPage auf diese Property zugreife, kann ich den Seitennamen trotzdem verändern.

        public string PageTitel
        {
            set { ((HtmlTitle)this.FindControl("mTitle")).Text = value; }
        }

Wieso funktioniert das in diesem Fall?

28.05.2009 - 12:47 Uhr

Hi.
Erstmal bitte [Hinweis] Wie poste ich richtig? Punkt 4 und 5 beachten.

Dann wird die Forumssuche sicherlich bei ähnlichen Aufgabenstellungen helfen: Aufgabenstellungen à la "bauen sie Schach". Les dir am besten mal solche Threads durch.

Um dir dann noch einen konkreten Tipp zu geben: Versuche die Logik des Spiels in eine extra Klasse zu verlagern. Diese Logik baust du dann soweit aus, das sie im Grunde ohne grafische Oberfläche funktioniert. (Vonwegen "platziere Stein hier", "ziehe von hier bis da") Dann kannst du anschließend eine grafische Oberfläche draufsetzen, die sich um das Darstellen und das Interagieren kümmert.

28.05.2009 - 11:37 Uhr

So, ich habs nun so gelöst, das ich beim OnInit der Page ein DataSet anlege, und dies über TableAdapter fülle.

Wenn ich die Änderungen komplett committen will, dann hole ich mir wieder die TableAdapter und führe die Update()-Methode aus. (Hier könnte ich dann auch über den TableManager, oder wie der nun genau heißt, gehen)

Meine gelöschten Zeilen wurden jedoch zunächst nicht in die Datenbank übernommen. Das lag daran, das ich die falsche Methode zum Löschen verwendet habe.

Ich hatte es zunächst mit

ds.dsTest.RemoveXYZRow(ds.dsTestRow.FindByXYZ(asd))

versucht, was nicht funktionierte.
Der gewünschte Erfolg trat dann über

ds.dsTest.FindByXYZ(asd).Delete();

ein

27.05.2009 - 20:02 Uhr

Schau dir mal mit Spy++ an, was da genau für ein ContextMenü erstellt wird. Eventuell kannst du bei der Erstellung dieses Handels diesen gleich mit modifizieren.

[edit: hmm ob das, wenn es geht als addin geht, kann ich nicht beurteilen]

27.05.2009 - 19:47 Uhr

Hi

Schau dir mal das FormClosing Event an. Dort gibts es einen enum der den Grund angibt. Das müsste dich weiterbringen

27.05.2009 - 10:48 Uhr

verwendetes Datenbanksystem: <AccessDB>

Morgen.
Ich stehe grade an der Stelle, wo ich in einer ASP.Net Anwendung auf eine Access Datenbank zugreifen muss. Das ist soweit auch kein Problem.
Ich will in einer DB-Tabelle Zeilen hinzufügen/entfernen, dies jedoch nur wenn ich einen "Commit"-Button drücke.
Dies mache ich, damit ich für diverse Änderungen, die ein User an einer Tabelle macht (z.B. 5 Spalten hinzufügen, wieder 3 löschen, nochmal 6 hinzu),
nur einmalig an die Datenbank übertragen werden.

Dafür will/muss ich ein DataSet verwenden, das mir quasi als Cache dient. (Das DataSet habe ich mir über den Designer zusammengeklickt)

Die Änderungen an der Datenbank werden jedoch leider direkt durchgeführt, egal ob ich nun ds.AcceptChanges() aufrufe oder nicht.
Ich denke der Fehler liegt bei der Verwenden der TableAdapter, jedoch weiß ich an der Stelle leider nicht, wie ich das erwünschte Ergebnis sonst erreichen kann.
Hat da jemand gerade ne Idee?

protected override void  OnInit(EventArgs e)
{
	 base.OnInit(e);
	 if (Session["dataset"] == null)
	 {
		 Session["dataset"] = new dsTest();
	 }
}

protected void Page_Load(object sender, EventArgs e)
{
	this.updateDataSource();
}

protected void gv_OnRowDeleting(object sender, GridViewDeleteEventArgs e)
{
	GridView gv = (GridView)sender;
	// workaround to find the primary key. the keys and value dictionaries of the GridViewDeleteEventArgs are only filled when using the DataSourceID property. See: [URL]http://forums.asp.net/p/1050092/1481766.aspx[/URL]
	int primId = (int)gv.DataKeys[e.RowIndex].Value;
	dsTest ds = (dsTest)Session["dataset"];    
	testTableAdapter ta = new testTableAdapter();
	ta.Fill(ds.testTable);
	ta.Delete(primID);
	Session["dataset"] = ds;
	this.updateDataSource();

}
	
protected void updateDataSource()
{
	dsTest ds = (dsTest)Session["dataset"];
	testTableAdapter ta = new testTableAdapter();
	ta.Fill(ds.testTable);
	var a = (from q in ta.GetData()
					  where q.primId == this.primID
					  select q);
	this.gv.DataSource = a;
	this.gv.DataBind();        
}

protected void BTN_Add_Click(object sender, EventArgs e)
{
	if (Page.IsValid)
	{
		dsTest ds = (dsTest)Session["dataset"];
		testTableAdapter ta = new testTableAdapter();
		ta.Fill(ds.testTable);
		/*werte holen*/
		ta.Insert(/* werte als parameter*/);
		Session["dataset"] = ds;
		this.updateDataSource();
	}
}

protected void commitChanges() 
{
	dsTest ds = (dsTest)Session["dataset"];
	ds.AcceptChanges();
}

protected void BTN_Commit_Click(object sender, EventArgs e)
{
	this.commitChanges();
}
27.05.2009 - 09:59 Uhr

Alternativ kannst du auch mit FindControl dir das Control auf eine Klasse des System.Web.Ui.HtmlControls Namespaces casten und dann damit weiterarbeiten.

01.05.2009 - 16:26 Uhr

[Hinweis] Wie poste ich richtig?
Punkt 4, 5,6

Da stimmt was nicht in meinem Programm!?

Was stimmt nicht?

Und wieso lässt du den Index 0 bei deiner Berechnung außen vor?

25.04.2009 - 15:08 Uhr

Durch erneutes googeln konnte ich nun feststellen, das ich nicht der Einzige bin der solch ein Verhalten beobachtet hat.

Als Erklärung wird der unterschiedliche Lifecycle angegeben, und das man ihn (als Workaround) forcieren müsste, indem man explizit auf den CPE zugreift, z.B. so:


object o = cpe.Controls;

Nur leider funktioniert bringt dies bei mir keine Änderung zustande.

18.04.2009 - 18:06 Uhr

Hallo zusammen. Ich arbeite mich gerade in das AjaxControlToolKit ein. Mit dem CollapsiblePanelExtender habe ich mir auch Panels gebaut, die ich per Klick ein/ausfahren kann.
http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CollapsiblePanel/CollapsiblePanel.aspx

Ich habe den CollapsiblePanelExtender (und die anderen Controls) in ein UserControl hinzugefügt.

Das Control lege ich beim Page_Load an, und füge es einem PlaceHolder hinzu.


            projectInfoBox infoBox1 = (projectInfoBox)LoadControl("~/Projekte/projectInfoBox.ascx");
 // ...
            this.controlPlaceholder.Controls.Add(infoBox1);

Sobald ich nun jedoch auf den LinkButton mit dem Text "Einklappen" klicke, ändert sich der Text kurz in "Ausklappen", dann kommt der vom CPE verursachte Postback und der Text ändert sich wieder in "Einklappen".


<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="projectInfoBox.ascx.cs" Inherits="webpage.Projekte.projectInfoBox" %>
     <ajaxToolkit:CollapsiblePanelExtender ID="infoBox_CollapsiblePanelExtender" runat="Server"
        TargetControlID="infoBox_CollapsiblePanel" 
        Collapsed="False" CollapsedSize="0" ExpandedSize="150"
        ExpandControlID="infoBox_LinkButton" CollapseControlID="infoBox_LinkButton"
        AutoCollapse="False" AutoExpand="False" ScrollContents="False"
        TextLabelID="infoBox_Label" CollapsedText="Show Details..." ExpandedText="Hide Details"
        ImageControlID="infoBox_Image" CollapsedImage="~/images/expand.jpg" ExpandedImage="~/images/collapse.jpg"
        ExpandDirection="Vertical" />
    <asp:Panel ID="cpeEins" runat="server">
        <asp:LinkButton ID="infoBox_LinkButton" runat="server" Width="500px" Font-Underline="false" BackColor="LightBlue">
            <asp:Image ID="infoBox_Image" runat="server" CssClass="imagePanel"/>
            <asp:Label ID="infoBox_Label" runat="server" ></asp:Label>
        </asp:LinkButton>
    </asp:Panel>
    <asp:Panel ID="infoBox_CollapsiblePanel" runat="server" HorizontalAlign="Left">
          // hier sind sonst controls drin
    </asp:Panel>

Der Fehler wird beim dynamischen Hinzufügen liegen, da das Control sonst problemlos funktioniert. Wo genau mache ich den Fehler, und wie vermeide ich ihn?

EDIT: So, ich habe nun festgestellt, das es nicht am UserControl, sondern am dynamischen hinzufügen liegt.

18.04.2009 - 10:39 Uhr

Alternativ könntest du den Farbverlauf auch von vertikal nach horizontal ändern. Dann hast du beim vertikalen Skalieren keine Probleme mit dem Farbverlauf.

17.04.2009 - 12:35 Uhr

Setze im Page_Load() die Properties nur, wenn die Page kein Postback ist.

16.04.2009 - 17:45 Uhr

Wenn ich auf den Button drücke

Dein Button feuert beim Klicken ein Postback. Eventuell hilft dir http://msdn.microsoft.com/de-de/library/system.web.ui.webcontrols.button.onclientclick.aspx weiter.

Alternativ könntes du auch das CollapsiblePanel aus dem AjaxControlToolKit nehmen, das nimmt dir diesbezüglich das ganze ab und lässt sich über Properties konfigurieren.

13.04.2009 - 22:50 Uhr

Ist eine Lizenzdatei, die einen Benutzernamen, eine Mail, einen Typ (Vollversion oder Trial) sowie eine mit einem privaten RSA-Key erstellten SHA1-Signatur für den Privatgebrauch in Ordnung?

Wie genau sieht die Datei jetzt aus? Wofür müssen die Email und der Typ in der Datei stehen? (Email lässt sich ja noch begründen) Wenn ja, sind diese da auch drin verschlüsselt? Vorallem, was passiert, wenn ich den Typ von Trial auf Vollversion ändere. Ich hoffe die Informationen fließen alle in die Keygeneration ein.

Hat es bei dir einen besonderen Anwendungsfall, das du solch eine Datei für eine Trial brauchst? Könnte nicht eigentlich jedes Programm eine Trial sein, sofern es keine Vollversion ist? Sprich, die Keydatei existiert nur bei Vollversionen.

13.04.2009 - 14:52 Uhr

Ich will/brauch ein Control, das einfach nur HTML-Seiten darstellt, OHNE Browserfunktion.

Stellst du dann auch sicher, das keine Links in dem HTML-Code vorhanden sind?

13.04.2009 - 12:59 Uhr

Hallo,
vielleicht hilft dir Bass.net mit entsprechenden Plugins weiter? http://www.un4seen.com/bass.html

Die Forumssuche könnte dir auch behilflich sein.

13.04.2009 - 01:41 Uhr

ich hab mir einen eigenen RadioButton gemacht

Bitte etwas genauer. Wenn es sinnvoll ist, dann poste bitte auch wichtige Codeausschnitte.
Hast du von system.windows.forms.radiobutton geerbt (dann sollte das Selektionsverhalten jedoch erhalten bleiben), oder hast du es anders gemacht?

13.04.2009 - 01:34 Uhr

Bei den Zeitschriften selber kann ich dir nicht weiterhelfen. Solltest du dich jedoch für "dot.net magazin" entscheiden, lies dir diesen Thread durch dot.net magazin Abo mit 15% Rabatt für myCSharp.de-Benutzer

12.04.2009 - 20:24 Uhr

Hast du [FAQ] Eigene Anwendung pluginfähig machen nicht gefunden, oder war es nicht hilfreich?

12.04.2009 - 18:19 Uhr

Die werden dahin gepackt, wo sie logisch dazugehören, also NICHT in einen eigenen Ordner oder Namespace

Gehen wir mal von EventArgs aus, die eine public string property haben.
Im BL hast du in einem Namespace eine Klasse 1, die diese StringEventArgs implementiert:

Businesslayer-Namespace{
 Subnamespace 1{
 ---> Klasse 1
 ---> StringEventArgs (wird in Klasse 1 verwendet)
 }
}

So wie ich dich verstehe, wäre die StringEventArgs-Klasse dann in dem Ordner bei dem Klasse 1 ist. Was passiert nun jedoch, wenn du diese speziellen EventArgs noch woanders brauchst? (In der folgende Illustration verwenden Klasse1 und Klasse2 diese EventArgs) Rutscht diese Klasse dann in einen höher gelegenen, gemeinsamen Namespace?

Businesslayer-Namespace{
 Subnamespace 1{
 ---> Klasse 1
 }
 Subnamespace 2{
---> Klasse 2
}
---> StringEventArgs
}

12.04.2009 - 17:20 Uhr

Für jede Klasse eine eigene Datei.

Gruppierst du die dann in einem EventArgs Ordner, oder sortierst die passend zu den entsprechenden Klassen? (Wobei es ja eigentlich übersichtlicher wäre, einen eigenen Ordner samt eigenem Namespace zu wählen?)

12.04.2009 - 16:14 Uhr

Frohe Ostern

Der Event CustomOrganizationTooLongValidator_ServerValidate oder CustomOrganizationTooShortValidator_ServerValidate wird nie aufgerufen. Das Event selber oder redest du von der ErrorMessage?

Die Funktion "Send_Click" wird immer ausgeführt, auch wenn einers der Felder nicht korrekt war und der CustomValidator demenstprechend eine Fehlermeldung ausgab. Was bringt es, wenn ein Button in einer ValidationGroup ist und trotzdem den dahinter liegenden Code ausführt?

Poste mal bitte die Methode des Buttons. Prüfst du denn dort überhaupt auf Page.IsValid?

Die Validatoren validieren im ersten Schritt clientseitig, also die Errormessages die in die ValidationSummary gepackt werden. Erst im nächsten Schritt erfolgt die serverseitige Prüfung. Um die ErrorMessage aus deinen CustomValidatoren in die Validationsummary reinzubekommen musst du ein wenig tricksen (lässt sich sicher googeln) oder du verwendest direkt frameworks wie JQuery, damit sollte es relativ leicht von statten gehen.

10.04.2009 - 13:23 Uhr

Hi.

Man könnte eine Konsolenanwendung auch ohne Fenster ausführen. Ob dann Speicher für dieses Konsolenfenster reserviert wird, keine Ahnung.

Ansonsten würde sich eventuell ein Windows Service (Dienst) dafür anbieten.

Oder, je nach Anwendungsfall (da du gerade über Timer sprichst) ein vom Windows Scheuduler regelmäßig gestarteter Prozess, der sich nach seiner Ausführung selbst beendet.

09.04.2009 - 22:33 Uhr

MSDN: Process.StandardOutput Property sollte das gesuchte sein

09.04.2009 - 22:25 Uhr

Hi
Hier wird der new Modifier erklärt: MSDN: new Modifier (C# Reference)
Benutze dennoch mal die Forumssuche. Vor nen paar Tagen müsste hier noch ne Diskussion drüber gewesen sein.

09.04.2009 - 17:29 Uhr

Ich habe nunmal versucht mich ein wenig in WCF einzuarbeiten, aber irgendwie mit mäßigem Erfolg:

Ich habe die Vorlage WCF-Dienstanwendung verwendet um einen Webservice zu schreiben. Im Debugmodus bekomm ich diese auch gestartet, aber wie einen "normalen" Webservice bekomm ich diesen nicht im IIS gehostet, da er die "Service1.scv" auf dem Server mit einem 404-Error quittiert. Vermutlich fehlt da irgendwie noch was.
Einen Clientproxy über einen Webverweis kann ich mir auch nicht hinzufügen, das scheint nichtmehr unterstützt zu sein. Geht wohl nur noch über SvcUtil.exe, die mir eine Clientklasse generiert bei der sämtlich using direktive fehlen. Super 🙄

Die einzigste halbwegs brauchbare Dokumentation war dieses hier
http://msdn.microsoft.com/de-de/library/ms734712.aspx
Ist mir allerdings zu wage geschrieben oder ich bin zu doof die Anleitung umzusetzen.

Nun steh ich an einem Punkt wo ich klare Dokumentationen brauche, da ich scheinbar nichts verstehe =) Wo find ich solche?
Da ich in der MSDN nicht richtig fündig werde, und mir das Probelesen von "Programming WCF Services von O'Reilly" den Bucheindruck vermittelt, das es mich zwar grundlegend dabei unterstützt, jedoch mit mangeldem Quellcode, wende ich mich nun an euch. Helft mir =)

09.04.2009 - 16:56 Uhr

Wäre View.Details was für dich?

09.04.2009 - 13:29 Uhr

Wenn du in einem bestimmten Fall überhaupt keine Icons willst, dann nimm doch aus der View-Enumeration einen anderen Wert?

09.04.2009 - 13:14 Uhr

Oder du deregistrierst das Checked-Event, solange es nicht gefeuert werden soll.

Das funktioniert? Ich hatte mal mit einer Listview in deren Events rumgespielt. Wenn ich Items hinzugefügt habe und danach das entsprechende Event abonniert habe, dann hatte er die Events quasi "inner Queue" und hat sie mir trotzdem noch geworfen.

[edit]
Was ich meine hatte ich hier ListView mit fester Spaltengröße mal gepostet, nur komischerweise kann ich jetzt nicht mehr reproduzieren. Sehr merkwürdig
[/edit]

07.04.2009 - 23:52 Uhr

Nun bin ich über die Stichwörter WSE und WCF gestolpert, zusammen mit dieser Aussage von Rainbird WS-Policy - allgemeine Frage
Da ich mit Version 3.5 arbeite, werd ich mich wohl in WCF einarbeiten 😉

07.04.2009 - 20:05 Uhr

Hallo trib,
sofern nur deine Anwendung auf die XML-Datei zugreift, würde sich an dieser Stelle auch ein Databinding zwischen der Checked-Eigenschaft und einer boolean Property aus einem Datenobjekt anbieten. Für mich hört es sich so an, als würdest du die XML-Datei serialisieren. Du müsstest nur dafür sorgen, das dieses Datenobjekt beim Starten deiner Form existiert und spätestens beim Schließen gespeichert wird.

07.04.2009 - 19:58 Uhr

Hallo zusammen,
ich bin gerade dabei mir einen Webservice zu schreiben. Hinter dem Websservice wird noch eine MSSQL Datenbank für eine Userauthentifizierung stehen. Die Datenbank enthält natürlich auch Daten, die der Webservice über Methodenaufrufe zur Verfügung gestellt bekommt.

Dabei soll ein Rollen-/Rechtesystem eingesetzt werden, sodass nicht jeder Client auf alle Methoden zugreifen darf, je nachdem was er für Rechte hat. Eine clientseitige Validierung halte ich dabei für wenig sinnvoll, da jemand der meine DLL verwendet, auch Methoden nach solchen Prinzip


if(Auth("username", "pw")){
 // do something
}

einfach überspringen kann.

Meine Zielstellung soll es nun sein, das ein User sich über eine Methode authentifizieren muss, um andere Methoden um vollen Umfang (oder überhaupt) benutzen zu können. Bevor ich nun ein Ticketsystem schreiben wollte, probierte ich folgendes Testszenario:

Hier ein Ausschnitt aus dem Webservice:

    public class mathe : System.Web.Services.WebService {
        protected bool _Authed = false;

        [WebMethod]
        public bool Auth(String pw1, String pw2) {
            this._Authed = (pw1 == pw2);
            return this._Authed;
        }

        [WebMethod]
        public int Add(int a, int b) {
            if (!_Authed) {
                throw new UnauthorizedAccessException();
            }
            return (a + b);
        }
    }

Aufruf aus einer Konsolenanwendung (mittels SoapClient / Webreferenz)

            if (client.Auth("blub", "blub")) {
                Console.WriteLine("hey, I'm authed!");
                Int32 res = client.Add(2, 3); // hier wird dann eine exception geworden
                Console.WriteLine(String.Format("Calculating 2+3: {0}", res.ToString()));
            }
            else {
                Console.WriteLine("authentification failed");
            }

Wie mir scheint wird für jeden Methodenaufruf eine neue Instanz "mathe"-Klasse erstellt, von daher werden Instanzvariablen, die zwischen mehreren clientseitigen Methodenaufrufen im Speicher bleiben sollen unmöglich. ++ Ist dies normal?++ (Zudem braucht der erste Aufruf auch mehrere Sekunden, aber das liegt wohl am JIT => Antwortzeit im XML-Webdienst)

Momentan läuft es darauf hinaus, das meine Authentifizierungsmethode in einer Datenbank einen Eintrag bezüglich IP und Gültigkeitsdauer anlegt (à la Ticket, mit IP, ExpireTime).
Bei jedem Methodenaufruf würde ich dann prüfen , ob ein gültiges Ticket vorliegt und wenn nicht, mit einer NotAuthorizedException den Dienst verweigern.

Geht das auch einfacher/eleganter?

07.04.2009 - 14:48 Uhr

Ich hole den Thread mal wieder rauf, da ich ein ähnliches Problem habe und dies der einzigste Thread zu diesem Thema zu sein scheint.

Also bei mir kamen die ersten drei Zeilen deiner Fehlermeldung beim Aktualisieren der Webreferenz. Wie sich wohl herausgestellt hat, liegt es an

     <webServices>
      <wsdlHelpGenerator href="about.aspx"/>
    </webServices>

http://msdn.microsoft.com/en-us/library/ycx1yf7k(VS.71).aspx

Wenn ich diese drei Zeilen wieder auskommentiere, klappt das aktualisieren der Webreferenz.

Hat jemand nie Idee, wie ich die "Standard"-Seite beim Aufrufen mit dem Browser unterbinden kann, und die Aktualisierung der Web Referenz trotzdem noch geht?
Oder wäre es besser, das Projekt so umzubauen, das ich keine Webrefenz, sondern nur einen normalen Verweis auf die DLL vom Webservice habe?

05.04.2009 - 13:44 Uhr

Hi,
ich kann dir bei den beiden Monitoren nicht wirklich weiterhelfen, da mich keiner von den beiden umhaut.
Ich selber habe zwei E207WFP von Dell. Damals gab es noch eine teurere Version (ca 50-70€), die zusätzlich S-Video und Chinch unterstützte sowie höhenverstellbar bar.

Wie du wohl schon selber erkannt hast, würde ich dir dringend raten, zwei identische Monitore zu benutzen. Eine Zeit lang habe ich an soetwas gearbeitet, und es war einfach störend, zwei unterschiedliche Auflösungen zu haben (z.b. 17zoll und 20 zoll monitor) oder auch die Helligkeit der Monitore nicht aneinander anpassen zu können (auf dem einen Monitor konnte ich grau als grau erkennen, auf dem anderen nur als weiß).

Momentan bin ich mit meinen Monitoren, abgesehen von der Tatsache das sie nicht höhenverstellbar sind (weil eigentlich soll der Monitor ja auf Augenhöhe sein, um weniger zu ermüden), super zufrieden. Daher rate ich dir, bevor du meinst 50€ für nen Monitor zu sparen, überlege ob es dir das längerfristig wert ist =)

Preislich ähnlich, sind diese Monitore sicherlich auch noch einen Blick wert:
http://accessories.euro.dell.com/sna/category.aspx?c=de&category_id=4009&cs=dedhs1&l=de&navla=338110162929&nf=338110162929&s=dhs&~ck=anav

Wenn der Link nicht geht, dann gehst du auf die Dell Seite: -> Für Privatanwender -> Elektronische Geräte & Zubehör -> Breitbildmonitore 20-22 Zoll.

22.03.2009 - 22:16 Uhr

Hmm also ich sehe das grad eher als Nachteil 😉

Lässt sich über Umwege was bauen? (Außer vielleicht mit Regex den CommandText zu replacen). Oder 'no chance' ?

22.03.2009 - 19:26 Uhr

verwendetes Datenbanksystem: MSSQL

Nabend. Wie in dem tollen Artikel [Artikelserie] Parameter von SQL Befehlen von juetho, verwende ich in meinem Datalayer auch die SqlParameterCollection..::.AddWithValue-Methode um parameterisierte Queries zu bauen.

Bevor ich dies getan hatte, lieferte mir die SqlCommand.CommandText Property den Querystring zurück, der dann auch an die Datenbank ging.

Wenn ich nun jedoch mit der SqlParameterCollection arbeite, dann enthält diese Property allerdings den Querystring mit den @-Platzhaltern. Für Debugzwecke benötige ich nun den String, der im Endeffekt mit
SqlCommand.ExecuteReader() abgefeuert wird. Wo ist der denn "versteckt"? Ich bin leider noch nicht fündig geworden.

21.03.2009 - 11:37 Uhr

Moin Golo Roden,
ich habe einen Bekannten der hat sich in den Garten eine Webcam samt Rechner gestellt, um festzustellen, was sich so alles im Garten rumtreibt, wenn er nicht da ist. Die Kamera war so eingestellt, das sie Fotos schießt, wenn sie Bewegungen registriert.
Dadurch hat er dann festgestellt, das der Gartennachbar mal gerne über den Zaun klettert und schaut was auf dem Gartentisch liegt.

Für diese "Capture-Picture-On-Movement"-Funktion gibt es fertige Programme.

und sie von überall im Haus per Webbrowser ansteuern können, um Bild und Ton zu erhalten Ist es denn von Nöten, einen Videostream zu benutzten? Klingt für mich eher schon nach starkem Ausspionieren als Überwachen.

Für den Fall, das du das du dir sowas selber bauen willst, gabs im Forum doch ein paar schöne Snippets:
WebCam mittels VFW in C#
Und irgendwo gab es noch einen Thread zur Bilderkennung, bzw schauen anhand von wie viel Quadranten Bilder anders sind, aber den find ich grad nich

20.03.2009 - 22:13 Uhr

kann mir jemand sagen wie ich in C# eine Methode aus einer Stringvariablen aufrufen kann?

Methode = delegate
Stringvariable = string
Dictionary mit dem Key vom Typ string, Value vom Typ delegate

Und ein if-else bzw switch-konstrukt ist für mich nicht akzeptabel.

Somit könntest du über den String, an die Methode gelangen.

Oder kannst du mit dem Begriff Dictionary nichts anfangen? Dann :rtfm:

20.03.2009 - 21:56 Uhr

Wie wärs mit einem Dictionary<string, delegate> ?

Siehe auch: [FAQ] Variablennamen zur Laufzeit zusammensetzen