Laden...
P
Phönix myCSharp.de - Member
Softwareentwickler & Administratiosmanager Fürth Dabei seit 06.01.2007 67 Beiträge
Benutzerbeschreibung

Forenbeiträge von Phönix Ingesamt 67 Beiträge

06.09.2010 - 09:34 Uhr

Hi Michi,

danke das du geantwortet hast. Dachte schon, dass keiner einen Rat hat. Die Idee mit dem Interface kannte ich noch nicht. Ich werd mir das mal in Ruhe durchlesen.

Gruß Phoenix

31.08.2010 - 10:00 Uhr

Hi Foermchen82,

also wenn du eine HTTPS Seite ansprichst bekommst du die Prüfung der Zertifikates gar nicht so mit. Wenn du vorher mit dem Browser auf der Seite warst und das Zertifikat installiert hast und das auch gültig ist, dann sieht man von dem Prüfungsvorgang im .NET eigentlich nichts. Ist das Zertifikat nicht vorhanden oder nicht gültig wirft .NET eine Exception. Um die Prüfung selber durchzuführen musst du so zu sagen deinen eigenen Code zwischenschieben. Wie du das machst kannst du in dem nachfolgenen Link etwas erfahren.

Zertifikatsprüfung über HTTPS

Gruß Phoenix

30.08.2010 - 09:30 Uhr

Hi Leute,

ich hab hier auf Arbeit wieder mal ein nicht ganz einfaches Thema. Und zwar suche ich für eine Webanwendung eine bessere Lösung als ich sie im Moment habe.

Jetzige Lösung:
Auf einer Seite der Webanwendung können Konsolenanwendungen hochgeladen werden. Diese werden dann in einem Verzeichnis auf dem Server gespeichert. Eine andere Seite ruft diese Anwendungen auf und gibt ihnen mittels Konsoleninput einen großen Text. Die Anwendungen verarbeiten das und geben das Ergebnis wieder als Text über den Konsolenoutput zurück. Die Webseite liest das Ergebnis und wandelt diesen Text in ein großes Dictionary um.

Meine Frage.
Gibt es eine Möglichkeit einfacher Programmcode dynamisch in die Webanwendung zu importieren und die Daten natürlich auch einfacher zwischen Webseite und Programmcode zu versenden ohne das ich alles immer aufbereiten muss? Ich hatte da in etwa an die Einfachheit von Webservices gedacht. Also das ich einfach eine Funktion der Anwendung aufrufen muss. Ich hatte schon mal nach dynamischen Einbinden von Dlls geschaut aber da findet man immer nur Sachen von fremden Anwendungen die nicht in C# geschrieben sind und dann auch nicht gerade einfach aufgerufen werden. Mir geht es in erster Linie darum, dass es sehr einfach geht, da ich wenig Muse habe mich wieder daran lange aufzuhalten, da ich alleine an einem großen Projekt arbeite.

Ich danke euch schon jetzt mal fürs Lesen und vielleicht hat ja der ein oder andere ne Idee, wie man das einfacher lösen könnte. Wäre nett wenn ihr auch gleich einen Link für eine Anleitung oder gleichwertiges dazuposten könntet. Quelltext kann ich leider nicht posten, weil das Projekt nicht für die Öffentlichkeit gedacht ist.

Gruß Phoenix

11.08.2010 - 15:39 Uhr

So ich hab es endlich nach 3 Tagen geschafft den WCF Service auf HTTPS um zu stellen. So schwer ist es eigentlich nicht, aber darauf zu kommen das bei


<service name=<Name> ...

der exakte Name der Klasse stehen muss ... man oh man. Ich hab immer gedacht das dort ein beliebiger Name stehen kann wie bei Behavior und Binding. Aber das steht auch nirgendswo in einer Anleitung beschrieben, dass es eben genau so festgelegt werden muss.

Danke noch mal an Martin für den Hinweis der Zertifikateinstellungen, die ich ebenso nicht bedacht hatte.

Also damit ist das Problem gelöst.

Gruß Phoenix

11.08.2010 - 11:57 Uhr

Hi Yheeky,

dem Button kannst du ein anderes Aussehen verpassen. Entweder über CSS oder direkt im ASP.NET oder C#. Kannst dir auch mal den asp:Hyperlink anschauen und da da gabs glaub ich auch noch ein anderes Control etwa mit dem Namen Linkbutton. Schau die dir mal genauer an da findest du auf jedenfall was.

Gruß Phoenix

11.08.2010 - 11:20 Uhr

Hi zerberos,

im Internet gibts dazu eigentlich ne Menge Material. Hier mal ein Auszug aus SELHTML: Klick Button

Bei den Beispielen siehst du das bei input oder button es eine Eigenschaft onclick gibt. Dort rufst du dann einfach deine Funktion auf und schreibst die Parameter mit rein.

Gruß Phoenix

11.08.2010 - 11:15 Uhr

Hi Yheeky,

du kannst ganz einfach einen ASP.NET Button einfügen und wenn der gedrückt wird führst du bei dem ClickEvent deinen C# Code aus.

Gruß Phoenix

11.08.2010 - 11:00 Uhr

Hi Martin,

danke für den Link das scheint doch mal eine gute Grundlage zu sein. Das was dort beschrieben ist, ist ja für wsHttpBinding und ich brauch es für basicHttpBinding. Daher meine Frage: Ist es eigentlich egal welches Binding man für HTTPS nimmt oder geht das mit basicHttpBinding nicht? Ich versuch es deswegen auf basicHttpBinding zu trimmen, da ich auf diesen Service später mit Mono gehe und ich weis das Mono noch nicht alles bei WCF implemetiert hat, aber basicHttpBinding hab ich schon mal mit HTTP gestestet.

Gruß Phoenix

11.08.2010 - 10:53 Uhr

Hi Bigeddie,

der Font der TextBox ändert sich deshalb, weil bei SingleLine in HTML ein <input> Tag verwendet wird und bei MultiLine ein <textarea> Tag. Den Font kannst du einzeln ändern über die Eigentschaft Font->Name oder halt mit CSS. Ich mach es meisten so das ich im CSS mit * allen HTML Tags einen Typ gebe und dann nur einzelne Sachen wie Überschriften abänder. Damit hat man nicht das Problem, dass die Browser die Schrift von verschiedenen Tags verschieden darstellen.

Gruß Phoenix

11.08.2010 - 10:39 Uhr

Ich hab das mal ausprobiert und der Fehler kommt jetzt beim Zertifikat. Ich hab es bei x509FindType mit FindBySubjectName, FindByIssuerName und FindBySerialNumber mit Fingerabdruck und Seriennummer probiert. Aber entweder kommt immer, dass er das Zertifikat nicht findet oder der Hexstring falsch ist.

Das Zertifikat was ich zum Testen verwende ist ein Selbstsigniertes das im IIS mit dem Namen test12345 erstellt wurde.

Hier der Auszug aus der Web.config:

<serviceCredentials>
   <serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" storeName="Root" findValue="test12345"/>
</serviceCredentials>

Bei den Zertifikaten vom lokalen Computer habe ich nachgeschaut, ob das Zertifikat vorhanden ist. Da ist es einmal bei vertrauenswürdige Stammzertifiakte sowie bei Eigene Zertifkate vorhanden. Daher hatte ich es auch bei storeName mit My versucht aber das bringt leider auch nichts.

Hat vielleicht jemand eine Anleitung für sowas, weil im Internet habe ich bis jetzt noch nicht genau den Fall gefunden wo es um einfaches HTTPS geht.

Gruß Phoenix

10.08.2010 - 19:06 Uhr

Hallo MartinZa,

danke für den Auszug. Den werd ich morgen gleich mal ausporobieren. Das mit dem Zertifikat dachte ich brauch ich nicht, da ja der IIS schon das Zertifikat hat was er nehmen soll und bei einem Webservice als ASMX hat das ja auch ohne funktioniert. Aber wenn es so gehen soll dann verusch ich das mal.

Gruß Phoenix

10.08.2010 - 15:17 Uhr

Hi Leute,

ich versuch jetzt schon seit 2 Tagen einen WCF Service auf HTTPS umzustellen. Leider kommt immer wieder diese Fehlermeldung.

Service 'User_System.Webservices.UserInfo' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Service 'User_System.Webservices.UserInfo' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[InvalidOperationException: Service 'User_System.Webservices.UserInfo' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element.]
   System.ServiceModel.Description.DispatcherBuilder.EnsureThereAreApplicationEndpoints(ServiceDescription description) +346
   System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +292
   System.ServiceModel.ServiceHostBase.InitializeRuntime() +82
   System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +64
   System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +789
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +287
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +1132

[ServiceActivationException: The service '/UserSystem/webservices/userinfo.svc' cannot be activated due to an exception during compilation.  The exception message is: Service 'User_System.Webservices.UserInfo' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element..]
   System.Runtime.AsyncResult.End(IAsyncResult result) +890624
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +180062
   System.Web.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar) +107

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1 

Ich verwende ASP.NET 4 und hoste das Ganze im IIS mit HTTPS + SSL. Rein mit HTTP geht es wunderbar (auch ohne große Konfiguration der Web.config). Bei dem Umstellen auf HTTPS hab ich schon vieles Varianten in der Web.config probiert aber immer kommt die selbe Fehlermeldung. Aus der Fehlermeldung konnte ich schließen das ich für HTTPS andere Endpunkte brauche, aber ich habe keine Ahnung wie die zu gestalten sind damit es funktioniert.

Hier mal die gedachte Web.config für HTTPS die ja leider nicht geht.

<system.serviceModel>
	<bindings>
		<basicHttpBinding>
			<binding name="basicHttpBindingSSL">
				<security mode="Transport">
					<transport clientCredentialType="None"/>
				</security>
			</binding>
		</basicHttpBinding>
	</bindings>
	<behaviors>
		<serviceBehaviors>
			<behavior name="DefaultBehavior">
				<serviceMetadata httpsGetEnabled="true" />
				<serviceDebug includeExceptionDetailInFaults="false" />
			</behavior>
		</serviceBehaviors>
	</behaviors>
	<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
	<services>
		<service name="UserInfoService" behaviorConfiguration="DefaultBehavior">
			<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBindingSSL" contract="User_System.Webservices.UserInfo" />
		</service>
	</services>
</system.serviceModel>

Wie schon zu erkennen möchte ich es über basicHttpBinding realisieren. Der ServiceContract ist die Klasse UserInfo im Namespace User_System.Webservices.

Gruß Phoenix

20.07.2010 - 16:06 Uhr

Hi w00dy,

also du willst links in der Tabelle Jobnamen haben und rechts dann Balkendiagramme die dann anhand der Minuten die entsprechenden Größen haben?

Also in etwa so?

Hallo |||||||||||||
Test ||||||||
Blub |||||||||||

Die Striche sind dann immer deine 1px Zellen.

Wenn ich das so richtig verstanden habe solltest du vielleicht einen anderen Ansatz verwenden.

Erst mal zu der Frage warum der Browser die Zelle nicht mit 400px sondern am längsten Namen ausrichtet. Der Browser stellt die Tabelle immer so dar, dass alle Zellen einer Spalte die gleiche Breite besitzen. Das kann man umgehen indem man ihm sagt, dass er mehrere Zellen in einer Spalte schieben soll (Stichpunkt colspan bei td). Wenn du die Balken dahinter direkt nach dem Ende des Namen haben willst sind Tabellen nicht ganz so gut geeignet. Nimm dafür einfach Divs die untereinander stehen, die sind dann unabhängig von den Divs drüber und drunter.

Für das Darstellen der Balken würde ich keine 1px Zellen verwenden, da diese je nachdem wieviele du verwendest sich unterschiedlich ausrichten können. Eine Tabelle in HTML ist immer so gestrickt das die Anzahl der Zellen in einer Zeile gleich groß und eine Spalte immer die gleiche Breite für alle Zellen nimmt. Dafür würde ich auch hier ein anderes HTML Element nehmen das du dann je nachdem wie groß der Balken ist per Programmierung die Breite festlegst.

Gruß Phoenix

20.07.2010 - 15:41 Uhr

Hi marv100,

also ich hab das Ganze mal für dich nachgestellt (was du eigentlich machen solltest) und bei mir geht es wunderbar. Habe über dem Div ein Span das mittels Javascript display auf none und wider zurück setzt. Die Datei wird definitv hochgelanden. CSS hat NUR Einfluss auf die Darstellung des HTML Codes und nicht auf die serverseitige Programmierung. Wie ich schon gesagt habe sind es andere Sachen die das Verhalten verändern. Am besten ist du stellst die Quelltextausschnitte mal rein und sagst was du alles sonst noch drum herum hast. An sonsten wird dir keiner weiter helfen können, da ja das display Element nicht für dein Problem zuständig ist.

Gruß Phoenix

20.07.2010 - 15:00 Uhr

Hi marv100,

ich kann mir schlecht vorstellen das ein CSS Element die serverseitige Verarbeitung beeinflusst. Bastel doch mal, unabhängig von der Seite wo du das verwendest, eine neue Seite und probier dort nur diese eine Funktion einzufügen. Glaube eher das du anhand der Komplexität vielleicht noch andere Werte verändert, die das Uploadverhalten beeinflussen.

Löst der Button, den du für das Einblenden des Divs benutzt, einen Postback aus?

Gruß Phoenix

06.07.2010 - 21:12 Uhr

Hi LuckyStrike,

für was brauchst du die Forms Authetification in einer eigenen dll? Ich versuch gerade Beispiele zu finden wo man das gebrauchen kann, aber mir fällt keins ein. Wenn du vielleicht meinst das du nur eine Forms Authentication für mehere Webanwendungen nutzen willst geht das auch ohne die dll in jedem Projekt einzubinden. Du musst dafür nur in Webconfig auf CrossPage einstellen und bei jeder Webanwendung die gleiche Loginseite eintragen.

Gruß Phoenix

06.07.2010 - 16:25 Uhr

@Cuin:

Genau bei der Berechnung des Kampfes beim client liegt der große Fehler. Denn ein Spieler kann sich eine eigene Seite mit Javascript bauen und dort die Berechnungen zu seinen Gunsten ausfallen lassen und die Daten dann an den Server schicken. So gewinnt er jede Runde. Da müsstest du die Varianten von MarsStein machen, indem du die Berechnung auf dem Server ausführen lässt und mittels AJAX nur eine Aktualisierung der Anzeige vornimmst. Das mit der Berechung im Service geht nicht am Client dann könnte ja er auch hier wieder das Spiel manipulieren. Der Service muss auf einem Server laufen.

Mit Echtzeit meinte ich Spiele wie Age of Empires, wo die Einheiten in paar Sekunden produziert und auch wieder vernichtet werden. Wenn das Spiel aber über längere Zeit sieht das mit der Belatung natürlich nicht so groß aus.

Um dem ganzen noch mal einen Überblick zu geben. Die Berechnungen und Daten des Spiel MÜSSEN auf dem Server sein und vor Manipulationen geschützt sein. Auf dem Client dürfen NUR Anzeige (Animation) und Benutzeraktionen gemacht werden. Du musst immer davon ausgehen das jemand das Spiel zu seinem Vorteil nutzen will. Und der gedanke ist noch harmlos das ist immer viel schlimmer als man denkt (sieht die Stämme).

06.07.2010 - 16:14 Uhr

Ja der IE8 ist nicht gerade der schnellste, aber mit dem IE9 sieht das wieder ganz anders aus. Deswegen ist es gerade für den IE8 wichtig den Viewstate zu deaktivieren wenn man ihn nicht braucht.

Gruß Phoenix

06.07.2010 - 16:02 Uhr

@MarsStein:

Naja mit AJAX hab ich schon so einige Hacks erlebt die man gemacht hat. Da würde ich bei solchen Sachen nicht gerade raten. Außer man kann sicher stellen das der Nutzer keine andere Seite bastelt und dort mit mit seinem AJAX am Spiel manipulieren kann.

Das mit dem Thread kannte ich noch nicht. Cool das es sowas gibt.

Gruß Phoenix

06.07.2010 - 15:56 Uhr

@Dawamaha:

Geh mal vom Windows Server aus über den Internet Explorer auf die Seite. Da kommt dann die ausführliche Fehlermeldung. Sollte das nicht gehen weil es von dort aus die Seite aufgerufen werden kann dann schalte beim IIS unter der Anwendung bei Fehlerseiten->Featureeinstellungen->Detaillierte Fehler ein und rufe die Seite von außen noch maöl auf. Dann steht auf der Fehlerseite sogar die Lösung des Problems. Such bei Google mal genau nach dem Fehlercode. Müsste dann wahrscheinlich was mit 401.x rauskommen mit einer genauen Meldung eben. Kannst ja auch mal hier posten dann können wir auch mit rätseln.

Gruß Phoenix

06.07.2010 - 15:47 Uhr

@Cuin:

Wo hast du dir dann gedacht wird das Event gefeuert? Wenn gerade kein Browser eine Seite anfragt kann auch in deiner ASP.NET Anwendung kein Event behandelt werden, es läuft ja keine Anwendung zu dem Zeitpunkt. Du kannst es nur machen indem du bei jedem Seitenaufruf des Spiels alle Bereiche prüfst ob da was gemacht werden muss (z.B. Truppen sind angekommen und dort hinsetzen). Aber das wird schon ab einigen Usern nicht mehr performant. Da brauchst du im Hintergrund eine Art Warteschleife als Anwendung, die die ganzen Aufgaben die anfallen abarbeitet. Und jede Sekunde eine Aktion ausführen ist für den Server viel zu belastend wenn viele Spieler gleichzeitig was machen. Wenn du ein Echtzeitstrategiespiel machen willst, dann würde ich dir raten einen Netzwerkserver zu bauen (über TCP die Daten übertragen) und den Client als WPF Anwendung oder Windows Forms wenn du nicht so viele Animationen hast. Weil dann kannst du die ganzen belastenden Berechnungen auf jedem einzelnen Client ausführen lassen und nur immer die Ergebnisse mit dem Server abgleichen.

Du merkst schon das dein Vorhaben nicht einfach ist. Deshalb fang einfach an und schaue wie weit du mit welcher Technologie kommst. Wenn es mit ASP.NET nicht mehr realisierbar ist, dann musst du halt dein Spiel auf Server-Client Anwendung umschreiben.

Gruß Phoenix

06.07.2010 - 15:33 Uhr

@tom-essen:

Wie du ja schon gemerkt hast gibt es mehrere Bereiche wo die Zeit nicht gerade wenig ist und alles zusammen ist dann doch ne ganz schöne Menge. Du kannst eben nur hergehen und jeden Breich debuggen und schauen was du noch optimieren kannst. Ich weis jetzt nicht ob du den Viewstate brauchst und wie groß der immer ist. Wenn du den nicht brauchen solltest und der recht groß ist dann dann deaktiviere für die Seite den Viewstate. Denn der wird bei jedem Aufruf zwischen Client und Server immer hin und her geschoben. Das heißt bei jedem Postback gleich 2x die Zeit vom Viewstate zum übertragen (einmal hin und dann wieder zurück).

Gruß Phoenix

06.07.2010 - 14:59 Uhr

Hi tom-essen,

sorry MarsStein ich will dich da nicht verbessern aber hier ist der aktuelle Link zum Lebenszyklus einer Seite. Auf der sind manche Dinge etwas besser aufbereitet und es gibt ne grafische Gesamtübersicht.

@MarsStein
wenn du den neuen Link verwendest halt ich mich auch zurück =).

Gruß Phoenix

06.07.2010 - 14:51 Uhr

Hi esehigs,

ich hab deinen Webservice mal in ein Konsolenanwendung und in eine Silverlightanwendung angefügt und bei mir ist das selbe wie bei dir heraus gekommen. In der Konsolenanwendung gehen alle Klassen und Funktionen aber in der Silverlightanwendung geht nur die eine Klasse zu erstellen aber keine eigenen Funktionen zum Ausführen sind vorhanden. Wenn du dir mal die Definition der Klasse anschaust (Rechtsklick auf die Klasse in der Main und dann auf Definition) dann siehst du das deine Klassen garnicht aus der WSDL Datei generiert wurden sind. Ich schätze mal das Silverlight mit den anderen Klassen und Funktionen nichts anfangen kann und deswegen weggelassen hat. Mit Silverlight kenn ich mich leider auch nicht genau aus, in wie weit man Sachen aus dem ASP.NET bzw .NET allgemein verwenden kann. Als Alternative könntest du vielleicht versuchen dein WSDL Service in ein WCF Service um zu schreiben, vielleicht kann dann der Parser alle Klassen und Funktionen generieren. An sonsten mal nachschauen wo Silverlight seine Einschränkungen im .NET hat. An dem Webservice kann es nicht liegen, da ja die Konsolenanwendung alle verwenden kann. Keine Angst ich hab keine Funktion Aufgerufen sondern nur getestet ob das Studio sie erkennt.

Gruß Phoenix

06.07.2010 - 14:24 Uhr

Hi Cuin,

ich glaube ich hab das mit dem Backgroundservice falsch verstanden. Ich dache es ist eine Schnittstelle über die man Administrieren kann. Aber was Tomot meinte ist, dass das Spiel ja jede Sekunde was macht. Sei es Einheiten sammeln lassen oder wandern. Für diese Sachen muss ja natürlich eine Anwendung auf dem Server laufen, die die Spieldaten aus der Datenbank holt, nach entsprechender Zeit verändert und wieder abspeichert. Weil der Browser ist ja nicht immer da und frag den Server jede Sekunde was zu machen ist. Wenn du ein Strategiespiel in Richtung die Stämme machen willst kommst du um sowas natürlich nicht drum herum. Wenn es aber nur ein kleines Browsergame ist was nicht zeitabhängig ist sondern von Runden oder Aktivitäten der Benutzer dann reicht es bei jedem Seitenaufruf die Berechnungen durch zu führen.

Wenn du uns näheres über das Spiel verrätst können wir dir auch mehr Tips geben. Aber musst die Idee auch nicht verraten wenn du willst. Ist ja deine Entscheidung =).

Gruß Phoenix

06.07.2010 - 11:34 Uhr

Hallo Dawamaha,

wenn die Anwendung mit SSL läuft schau mal bitte ob du im IIS bei der Anwendung unter SSL die Einstellung auf "Benötigt" steht. Wenn ja dann braucht der Server ein Zertifikat was der Browser wahrscheinlich nicht mitschickt. Wenn du nur Verschlüsselung und keinen Inhalt von Zertifikaten brauchst dann stell bei SSL "Ignorieren" ein. Dann verlangt der der Server kein Zertifikat vom Browser und leitet dich sofort zum Login weiter.

Gruß Phoenix

06.07.2010 - 11:28 Uhr

Hi Cuin,

also wenn du Student bist dann hast du bei deinem MSDN AA Account ja die Visual Studio Versionen mit drin. Du redest aber die ganze Zeit von der 2008er Version. Ich rate dir aber auf die 2010er zu gehen da du dort .NET Framework 4.0 und die neuen Features des 2010er Studio verwenden kannst. Bei den Visual Studio Versionen ist es so, dass die Express Version immer nur eine speziellen Part enthält. Zum Beipsiel C# auf Anwendungsebene (Visual Studio C# Express) und C#/VB auf Webebene (Visual Studio Webdeveloper Express). Aber da du ja auf die Kostenpflichtigen kommst reicht da schon die Professional Version aus (bei 2008 reicht Standard). Die beinhaltet dann schon beides zusammen. Um so höher du dann mit der Version gehst desto mehr Features sind drin (z. B. UML Diagramme in der Ultimate). Und der IIS Server zum Debuggen ist in allen kostenpflichtigen Versionen ebenso enthalten. Dazu gibts bei Wikipedia auch mehr Informationen.

Die Berechnungen für das Spiel rate ich dir soweit wie es geht auf dem Server zu machen, da im Client dafür dann zusätzlich Javascript benötigt wird bzw. der Client den Code abändern kann und somit die Berechnungen verfälschen kann. Auf dem Client (Browser) sollten nur Benutzerinteraktionen wie Clicken, Ziehen usw. und Anzeigen erfolgen (Bilder, Animationen).

Das mit dem Backgroundservice finde ich für den Anfang etwas schwer. Es reicht zu Beginn auch wenn du auf deiner Seite einen Login für den administrativen Bereich machst. Wenn du dann später das Spiel unter die Massen verteilen willst sollte man natürlich den normalen Benutzerzugang und den Adminzugang nicht gerade auf der selben Seite machen.

Gruß Phoenix

05.07.2010 - 18:08 Uhr

Hallo Dawamaha,

die Webconfig ist definitiv für den IIS und soweit ich das beurteilen kann auch ausreichend für die normale Formauthetifikation. Wenn die login.aspx nicht vorhanden ist könnte es vielleicht daran liegen. Diese musst du implementieren. Hast du zusätzlich zu der Formauthetifikation auch noch andere Varianten drin, wie zum Beipsiel Windows Authentifiaktion? Weil die kommt noch vor der Formauthetifikation und wenn die nicht geht kommst du ebenso wenig auf die login.aspx. Am besten beschreibst du das ganze noch etwas näher vielleicht kommt man dann eher auf den Fehler (welche Einstellungen, Aufbau Webanwendung).

Gruß Phoenix

05.07.2010 - 17:44 Uhr

Hi Cuin,

also wenn du ASP.NET programmieren willst rate ich dir die kostelose Visual Studio 2010 Webdeveloper Version runter zu laden. Dort kannst du in C# programmieren und viele Editoren wie für CSS oder HTML nutzen. Wenn du bei der Version ein Projekt debuggen willst dann startet automatisch der IIS Development Server der fast genau so wie der IIS funktioniert. Damit kannst du sehr einfach deine Anwendung testen und ASP.NET Seiten in einzelnen Schritten durchlaufen. Nicht zu vergessen bei der Version ist auch automatisch der SQL Server 2008 Express mit dabei. Ich rate dir von XAMPP ab. Das ist eher ein Paket für PHP und MySQL. Wenn du dann später deine Anwendung länger als nur für das Debuggen laufen lassen willst kannst du auf deinem Windows den integrierten IIS nachinstallieren und dort hosten. Beim Visual Studio 2010 drauf achten das es zwei Varianten gibt eine Seite zu erstellen. Einmal als Wenanwendung (über Proejkt zu erstellen) und eine Website (über Website). Ich rate dir eine Webanwendung zu machen, das es bei der Variante zwar eine fertige dll kompiliert, die du nicht ohne dem Projekt ändern kannst, aber wesentlich schneller läuft und weitere kleine Vorteile hat. Bei der Website kannst du jederzeit den Quellcode editieren, aber die Ausführungszeit ist etwas geringer und der Code kann schnell mal ungewollt verändert werden.

Gruß Phoenix

05.07.2010 - 12:55 Uhr

Hi Cuin,

wenn du schon grundlegend weist mit welchen Technologien du das machen willst hast du schon den ersten Schritt gemacht. Um ASP.NET wirst du bei C# eh nicht drum herum kommen, außer du machst alles in Silverlight. Ich würde dir raten erst ein mal als Ziel setzen, dass Spiel auf HTML zu bauen, also Basic ASP.NET. Wenn du dann die Idee weitestgehend umgesetzt hast kannst du dann bestehende oder kommende Teile sogar in AJAX oder Silverlight machen. Silverlight eigenet sich hervoragend für Animationen und Effekte im Spiel. Aber wie gesagt erst mal das Spielprinzip an sich bevor du die Animationen machst.

Bei der Datenablage ist meist SQL die bevorzugte Variante. Aber es kann auch sein, dass du je nachdem was das Spiel können soll, vielleicht auch Daten direkt im Filesystem ablegen solltest. Bei der Programmierung solltest du daher entscheiden welchen SQL Server du verwenden willst. Am nächsten liegt natürlich der MS SQL Server aber auch MySQL oder andere sind auch nicht verkehrt.

Am Anfang ist es ganz wichtig das du nicht einfach drauf los programmierst, sondern die Idee erst ein mal schriftlich festhälst. Wenn du dann das Grobe zu Papier gebracht hast, solltest du die Idee dann weiter verfeinern und dir langsam überlegen wie du das Ganze dokumentierst. Bevor du anfängst zu programmieren sollten vom Spiel schon möglichst alle Abläufe, Schnittstellen und Datenablagen bekannst sein. Das heißt du solltest dir im Klaren sein welche Klassen du für welche Daten und Funktionen brauchst bzw. über welchen Schnittstellen die Klassen kommunizieren (Funktionsname mit Parametern).

Ab diesem Zeitpunkt kann man anfangen los zu legen. Natürlich gibt es während der Entwicklung einige Abänderungen am Entwurf aber all zu große sollten es nicht sein, da sonst das ganze Spiel später vielleicht wieder mit mehr Aufwand abgeändert werden muss damit es so funktioniert wie es geplant war. Jeden Schritt den du fertig gestellt hast oder am Entwurf veränderst muss auch hier wieder gut dokumentiert werden.

Wenn es mehrere Leute sein sollten müsst ihr euch gut absprechen und öfters mal zusammen setzen und die nächsten Schritte aufteilen. Änderungen am Entwurf sollten möglichst immer gemeinsam beredet werden da es sonst zu unschönen Momenten kommen kann (harmlos ausgedrückt).

Hier mal noch einen Link zum Wiki wie so ein Ablauf von statten geht:
Softwareentwicklung

Gruß Phoenix

05.07.2010 - 09:31 Uhr

Also ich hab jetzt eine Lösung gefunden, wie ich das realisieren kann. Ich mach das über ein Gridview, dem ich ein zweidimensionales Array übergebe. Die Werte bleiben dann erst mal immer im Gridview. Für die Checkboxen braucht man dann noch eine Template Spalte dem man dann immer sagt, dass dort eine Checkbox sein soll. Hätte nicht gedacht, dass es so schwer ist so ein Beispiel zu finden. Hab es aber schließlich aus mehreren Seiten vom einem sehr guten Microsoft Buch geschafft das Beispiel zusammen zu bauen.

Das Ganze sieht dann so aus:

ASPX Seite:


<asp:GridView runat="server" ID="gridView">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox ID="checkBox" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:Button runat="server" ID="button" Text="Click" />

C# Code

Seitenereignis:


if (this.IsPostBack)
{
    ArrayList data = new ArrayList();
    ...

    this.testgridview.DataSource = data;
    this.testgridview.DataBind();
}

Buttonclick:



foreach (GridviewRow row on this.gridview.Rows)
{
    CheckBox cb = (CheckBox)row.Cells[0].FindControl("checkBox");
    
    if (cb.Checked)
        ...
}

Gruß Phoenix

05.07.2010 - 08:30 Uhr

Hi Peter,

hmm ne das meinte ich nicht ganz so. Mir gehts eher darum, dass ich im oberen Teil der Seite eine Suche habe und unten in einer Tabelle die Ergebnisse habe, wo rechts dann Checkboxfelder sind. Darunter ist dann ein Button mit dem man die Ergebnisse die ausgewählt wurden in der Datenbank gespeichert kann. Das heißt wenn ich oben auf Suche gehe baut sich die Tabelle auf. Bis dahin ist ja alles io. Blos wenn ich jetzt auf Übernehmen gehe muss ich ja beim 2. Postback die Tabelle neu aufbauen und dazu muss ich mir ja vorher die Daten auch noch merken. Das ist recht umständlich, wenn es noch dazu mit Checkboxen ist. Ich hoffe mit dem Beispiel konnte ich euch das Problem etwas verdeutlichen.

Gruß Phoenix

02.07.2010 - 11:21 Uhr

Hi TobiHobi,

dann ist doch die Variante die ich beschrieben habe genau die richtige für denn Anfang. Ich geb mal Beispiele vielleicht hilft das etwas.

Zum einfügen in die Datenbank:


string variable = "..."; // Dein Wert

SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = new SqlConnection("....");  // SQL Verbindungsstring
sqlCommand.Connection.Open();

sqlCommand.CommandText = "insert into xytable values(@value1)";  // SQL Query
sqlCommand.Parameters.Add("@value1", SqlDbType.VarChar).Value = variable; // Deine Variable durch @value1 ersetzen
sqlCommand.ExecuteNonQuery();  // Insert ausführen

sqlCommand.Connection.Close();

Zum Auslesen aus der Datenbank


SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = new SqlConnection("....");  // SQL Verbindungsstring
sqlCommand.Connection.Open();

sqlCommand.CommandText = "select xy from xytable";  // SQL Query
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();  // Select ausführen

while (sqlDataReader.Read()) // Lese solange Werte vorhanden sind
{
    string variable = sqlDataReader.GetString(0); // Spalte 0 der Abfrage auslesen
}

sqlCommand.Connection.Close();

Gruß Phoenix

02.07.2010 - 11:06 Uhr

Hi MarsStein,

ja sorry hast recht. Der Viewstate überschreibt ja den Eintrag der im PreInit gemacht wird jedesmal deswegen steht es nur ein mal drin. Und ich hatte immer geglaubt (weil ich es so getestet hatte) das Init immer nur ein mal durchlaufen wird.

Gruß Phoenix

02.07.2010 - 10:59 Uhr

Hi Tobi,

kennst du dich schon mit SQL Abfragen aus? Wenn ja dann würde ich den klassichen Einstieg über SqlCommand gehen. Das heißt du baust dir erst ein SqlCommand Objekt mithilfe von einem SqlConnectionStringBuilder oder auch direkt mit einem String und fügst über das Attribut CommandText dann die Query ein. Mit Execute Methoden kannst du die Querys ausführen und über ein SqlDataReader dann auch auslesen.

Hier mal einen Link zum Kapitel eines Visual C# Buch (Link). Sollte der Einstieg etwas zu schwer dann sag einfach bescheid.

Gruß Phoenix

02.07.2010 - 10:43 Uhr

Hi MarsStein,

die Init Ereignisse sind dafür nicht gerade gut geeigenet, da du die GridViews ja nach einem Postback benötigst und Inits werden ja nur beim ersten mal durchlaufen.
Sorry aber das ist Unsinn. Natürlich werden die Init-Ereignisse auch bei einem PostBack durchlaufen...

Nein werden sie nicht. Teste es mal mit einem Button und einem Label und lass dir bei Load und Init mal was ins Label schreiben. Dann wirst du sehen das Init nur ein mal drin stehen wird und Load beim jedem Postback reinschreibt.

PS: Bitte das nächste mal nicht gleich mit "Unsinn" kommentieren.

Gruß Phoenix

02.07.2010 - 09:18 Uhr

Hi Kaji,

ja das ganze Thema ist manchmal etwas verwirrend. Ich muss dir ehrlich sagen, dass ich nicht sehr gerne mit MVC arbeite, da ich den Unterschied zwischen Controller und View nicht wirklich verstehen kann. Ich reduziere das meistens auf Model und View. Dabei ist die View nur für Darstellung und Benutzerinteraktion zuständig. Das heißt die ganze Verarbeitung der Daten wird komplett im Model gemacht. Die View startet damit nur den Vorgang und holt sich am Ende die Daten ab und stellt sie nur noch da.

Im Bereich ASP.NET wollte ich auch in die Richtung MVC gehen, aber da ich damit nicht wirklich besser zurecht kann, hab ich das ganze wieder auf eine ASPX Seite (View) mit Codebehind (Model) reduziert.

Was ich damit sagen wollte ist, dass du nicht nach einer exakten Grenze zwischen Model, View und Controller bzw. der genauen Definition des MVC suchen darfst. Es gibt da gewisse Bereiche, die je nach Anwendung und Verständnis des Programmierers etwas abweichen. Lese dich viel in solche Sachen ein und du wirst deine eigene Variante entdecken.

Gruß Phoenix

02.07.2010 - 09:02 Uhr

Hi Freeman4gu,

die Init Ereignisse sind dafür nicht gerade gut geeigenet, da du die GridViews ja nach einem Postback benötigst und Inits werden ja nur beim ersten mal durchlaufen. Wenn du die Gridviews nach einem Postback noch haben möchtest, musst du sie entweder beim Client im Viewstate speichern oder dir in der Session hinterlegen. Im Viewstate würde ich nicht gerade empfehlen, da die Daten wahrscheinlich nicht gerade wenig sind und die ja jedesmal mit übertragen werden. Ich hatte mal ne riesige Liste im Viewstate und die hat beim Laden bzws. wieder abschicken Ewigkeiten gebraucht.

Bei der Session musst du die einfach beim Erstellen mit dort rein hängen und beim nächsten Aufruf wieder rausholen und auf der Seite hinzufügen. Wenn du Ereignisse verwendest darauf achten das die Controls ID haben sonst generiert der Server wieder andere und die Ereignisse werden nicht ausgelöst.

Schau dir mal auf der aktuellen Seite (Lebenszyklus von Seiten), die dir MarsStein empfohlen hat nach, da gibt es ganz unten eine schöne Grafik, wo du genau sieht in welcher Reihenfolge was kommt. Da kannst du genau sehen, wann gewisse Daten beim Postback wieder hergestellt werden bzw. wann du die Controls wieder hergestellt haben musst bevor die Ereignisse eintreten.

PS: in einem Thema drüber versuche ich auch gerade zu erfragen wie man so etwas einfacher lösen kann.

Gruß Phoenix

02.07.2010 - 08:38 Uhr

Hi Leute,

da ich viel mit ASP.NET arbeite und auch ab und zu mal eine Table verwende wollte ich euch fragen, wie man am besten eine Table befüllt, so dass die TableRows (ebenso TableCells) dann bei einem Post erhalten bleiben.

In der Vergangenheit habe ich es immer so gelöst, dass wenn die TableRows dynamisch hinzugefügt werden auch gleichzeitig in einer Session Variable landen und dann beim nächsten Aufruf dort heraus wieder eingefügt werden. Das ganze hatte ich auch schon mit dem Sitzungszustand realisiert, aber dafür sind die DAten einfach zu viel, um sie immer hin und her zu schicken.

Gibt es denn da keine vorgefertige Variante im ASP.NET? Das hat doch sonst immer für alles eine Lösung schon parat. Deshalb kann ich mir schlecht vorstellen, dass man sowas selbst immer erstellen muss.

Gruß Phoenix

02.07.2010 - 08:25 Uhr

Hi Kaji,

vielleicht ist der Einstieg auf der Seite, die weiter oben genannt hast, nicht ganz geeignet, um das Verständnis für MVC zu bekommen. Ich würde dir raten erst ein mal das Grundverständnis von MVC anzuschauen. Dann kannst du direkt in die Programmierung auf der Seite einsteigen.

Wikipedia bietet hier eine sehr gute Übersicht für MVC (Link)

Gruß Phoenix

13.01.2010 - 14:55 Uhr

Soweit ich das verstanden habe tritt das Ereignis ein, wenn du eine neue Zeile hinzufügst. Wenn du das auch bei einem Postback machst ist das ja alles drin. Geh am besten deine code mal durch und schau wann welches Ereignis nach einem Postback ausgelöst wird. Geh von den Page_*** Ereignissen aus.

13.01.2010 - 14:12 Uhr

Ich hab eine Lösung gefunden.

Der Ansatz mit dem Webanwendungsrootzeichen (~) war der richtige.

Ich hab einfach das normale div das es nicht kann durch ein Panel ersetzt. Das Panel stellt ja dann auch ein div dar.

<asp:Panel runat="server" BackImageUrl="~/Layout/banner_fill.jpg" Height="100" />

zu

<div style="height: 100px; background-image: url(~/Layout/banner_fill.jpg)">
</div>

dann nimmt er immer den richigen Pfad. Danke noch mal an euch beide.

MfG Phönix

13.01.2010 - 14:02 Uhr

Mit FindControl und der Suche nach der ID ist da der beste Weg. Wenn das nicht ging wie du es beschrieben hast, liegt es vielleicht daran, dass du beim Postback die Checkboxen nicht wieder hinzugefügt hast. Denn in ASP.net ist es so, dass bei jedem Aufruf die Control erstellt werden müssen, die Daten aber dann direkt vor Page_Load in diese dann geladen werden.

13.01.2010 - 13:58 Uhr

Danke für die schnellen Antworten.
Eure Ansätze sind schon mal nicht schlecht, aber leider verwende ich die Grafiken nicht in C# sondern direkt im Style bei div. Das würde heißen ich müsste für die ganzen Sachen mit response.write das div schreiben damit ich die pfade verwenden kann. Hmm eine Lösung aber nicht gerade das was ich mir gedacht hatte.

13.01.2010 - 12:51 Uhr

Hi Koerk,

wann willst du denn die Checkboxen wieder auslesen?

  1. im späteren Verlauf des Ladens der Seite
  2. beim Postback auf die selbe Seite
  3. Postback auf eine andere Seite

Je nachdem wann du drauf zugreifen willst gibts es da unterschiedliche Wege bzw etwas zu beachten.

MfG Phönix

13.01.2010 - 12:47 Uhr

Hi Leute,

ich habe bei einer Webanwendung im root Verzeichnis eine Masterseite liegen. Diese wird von allen Seiten verwendet. Die Seiten liegen in ver schiedenen Verzeichnissen und im root Verzeichnis der Webanwendung. Wenn eine Seite im root Verzeichnis drauf zugreift funktioniert es wunderbar da die Pfade im CSS bei der url() Funktion richtig sind. Wenn aber eine Seite in einem Unterverzeichnis die Master verwendet werden die Grafiken nicht gefunden, da er ja vom Unterverzeichnis ausgeht und es aber vom root aus machen müsste

Jetzt meine Frage: Gibt es eine Möglichkeit die Pfade der Masterpage dynamisch zu machen oder eine andere Art diese Masterpage einzubinden, damit die Grafiken von überall geladen werden?

Ich möchte nicht die Grafiken in alle Unterverzeichnisse kopieren oder alle Seiten ins root Verzeichnis legen. Das bringt mir nichts.

Hier noch mal eine Übersicht.

root
|
|-Ordner 1
| |-Seite1.aspx (nutzt Layout.Master)
| |-......
|
|-Ordner 2
| |-Seite1.aspx (nutzt Layout.Master)
|
|-Grafiken
| |-banner.jpg
| |-......
|
|-Layout.Master (nutzt die Grafiken über CSS mit url(Grafiken/banner.jpg) )
|-Seite1.aspx (nutzt Layout.Master)
|-......

Hoffe das mit der Übersicht es etwas verständlicher wird.
Danke schon mal im Voraus.

MfG Phönix

03.12.2009 - 09:10 Uhr

Hi reteep,

Die Fehlermeldung ist ja dafür da, dass man dort eine Hilfe bekommt. Wenn man genauer hinschaut steht da, dass der Server einen HTTP Error 400 erzeugt hat. Hier ist mal ein Link wo du nachlesen kannst was der Fehler beinhaltet. So wie ich das sehe ist beim Aufruf im Client etwas falsch programmiert.

MfG Phönix

02.12.2009 - 13:39 Uhr

Hi katarch,

wenn die TextBox ein Member der Klasse ist würde ich dir raten eine Property zu machen die du zb. Text nennst und dort den Wert von _txtResult.Text zurück gibst. Somit kannst auf den Text von außerhalb drauf zugreifen.

Hier das Beispiel


public string Text
{
    get
    {
        return this._txtResult.Text;
    }
}

MfG Phoenix

02.12.2009 - 12:53 Uhr

Hi Leute,

ich hab hier eine Klasse ModuleVersion, die ich bei einer Funktion des Webservices als Array zurückgebe.


[WebMethod]
public ModuleVersion[] ListModules()
{
  ...
}

Bei dem Webservice geht alles wunderbar, nur auf der Clientseite nicht. Da kommt Zwar das Array an und hat auch die richtige Anzahl an Elementen nur die Objekte enthalten alle null oder 0 Werte. Liegt wahrscheinlich daran das im Webverweis nur partial class ModuleVersion steht und nichts weiter drin ist. Wie mache ich jetzt die gesamte Klasse bekannt? Oder liegt der Fehler wo anders?

Hier noch mal die Klasse ModuleVersion


namespace Webservices
{
    /// <summary>
    /// Stellt wichtige Informationen von einem Modul dar.
    /// </summary>

    public class ModuleVersion
    {
        private string name;
        private string hash;
        private int timeout;
        private int interval;
        private string extension;
        private string command;

        public ModuleVersion()
        { }

        /// <summary>
        /// Erstellt eine neue Instanz der Klasse ModuleVersion.
        /// </summary>
        /// <param name="name">Name des Moduls.</param>
        /// <param name="hash">Hashwert der ausführbaren Datei.</param>
        /// <param name="timeout">Zeit in der das Modul beendet sein muss.</param>
        /// <param name="interval">Zeit in der das Modul wiederholt wird.</param>
        /// <param name="module">Ausführbare Datei des Moduls.</param>
        /// <param name="extension">Dateiendung der ausführbaren Datei.</param>

        public ModuleVersion(string name, string hash, int timeout, int interval, string extension, string command)
        {
            this.name = name;
            this.hash = hash;
            this.timeout = timeout;
            this.interval = interval;
            this.extension = extension;
            this.command = command;
        }

        /// <summary>
        /// Name des Moduls.
        /// </summary>

        public string Name
        {
            get { return this.name; }
        }

        /// <summary>
        /// Hashwert der ausführbaren Datei.
        /// </summary>
        
        public string Hash
        {
            get { return this.hash; }
        }

        /// <summary>
        /// Zeit in der das Modul beendet sein muss.
        /// </summary>

        public int Timeout
        {
            get { return this.timeout; }
        }

        /// <summary>
        /// Zeit in der das Modul wiederholt wird.
        /// </summary>

        public int Interval
        {
            get { return this.interval; }
        }

        /// <summary>
        /// Dateiendung der ausführbaren Datei.
        /// </summary>

        public string Extension
        {
            get { return this.extension; }
        }

        /// <summary>
        /// Befehl mit dem das Modul ausgeführt wird.
        /// </summary>

        public string Command
        {
            get { return this.command; }
        }
    }
}

MfG Phönix

12.08.2009 - 21:23 Uhr

Hi flushdraw,

hast du schon mal probiert über einen Webverweis den Webservice in das Projekt ein zu binden und dort dann über <Project>.<Verweisname>.<Webesrviceklasse> auf zu rufen?

Um heraus zu finden wie die Objekte aufgebaut sind kannst du nur in die Dokumentation des CMS schauen oder das PHP-File genau untersuchen.

MfG Phönix