Laden...

.txt auf Server öffnen ohne Download (besser mit Database)

Erstellt von wurstpeter vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.277 Views
W
wurstpeter Themenstarter:in
76 Beiträge seit 2006
vor 17 Jahren
.txt auf Server öffnen ohne Download (besser mit Database)

Hallo 😉
ich schon wieder

naja... ich hab ein "simples" Programm das den einen Key überprüfen soll, ob er auf dem Server vorhanden ist:
Ich habe das bisher so realisiert:


bool execute = false;
double versLokal = 0;
versLokal = Convert.ToDouble(this.keyfield.Text);
string tempVersInfo = "C:\Windows\keys.txt"
string pathVersInfoServ = "http://meinspace.de/keys.txt"


	wc.DownloadFile(pathVersInfoServ, tempVersInfo);
            TextReader tr = new StreamReader(tempVersInfo);
           
            int NumberOfLines = 15;
                        string[] ListLines = new string[NumberOfLines];
				  for (int i = 1; i < NumberOfLines; i++)
            {
                ListLines[i] = tr.ReadLine();
                
                double  verstest = Convert.ToDouble(ListLines[i]);
                if(versLokal == verstest)
                {
                	execute = true;
                break;
                }
            }

D.H er läd die Text Datei runter und schaut, ob der Key in der Textdatei vorhanden ist...und erlaubt dann dem Programm sich zu laden....

naja wie ihr euch denken könnt ist es ja ziemlich unsicher, und wenn jemand merkt, dass die key.txt auf seiner Platte gespeichert wird, hat er ja die einsicht auf alle funktionierende keys was ja nicht sein muss.

Also ist meine Frage, wie öffne ne ich meine Datei auf dem Server ohne Local herunterzuladen.

Ja eine Möglichkeit wäre über eine Datenbank, da ich aber relativ neu in c bin habe ich nich so ganz den Plan, dass ganze über eine Datenbank auslesen zu lassen.

MfG

Peter

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
in dem Fall würde ich versuchen, den Key auf dem Server auszuwerten, und nur noch das Ergebnis der Abfrage zurückschicken. Dafür eignet sich hervorragend ein Webservice über eine .asmx Datei.
Da kannst Du eine Methode einfach mittels Attribut im Netz verfügbar machen.


[WebMethod]
bool CheckKey(String key){}

Auf der Clientseite fügst Du dann einfach deinem Projekt einen Webverweis hinzu, gibst die URL an und den Rest macht VisualStudio. Dann kannst Du die Methode vom Client her einfach aufrufen. Der interne Datenverkehr läuft dann über XML/SOAP.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

35 Beiträge seit 2006
vor 17 Jahren

du kannst das file auch per webrequest einlesen (in diesem falle zeilenweise, weil du voraussichtlich in jeder zeile eine nummer enthalten hast)


/*
 * using System.Net;
 * using System.IO;
 */

bool execute = false;
double versLokal = Convert.ToDouble(this.keyfield.Text);
string pathVersInfoServ = "http://meinspace.de/keys.txt";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pathVersInfoServ);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
while(!sr.EndOfStream) {
    if(versLokal == Convert.ToDouble(sr.ReadLine()))
    {
        execute = true;
        break;
    }
}
sr.Close();
response.Close();

we love C#...

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
in dem Fall werden aber bei jeder falschanfrage alle gültigen keys über's Netz geschickt... Das gilt es auf jedemn Fall zu vermeiden. wenn da jemand seinen HTTP-Port abhört, bekommt er alle keys!
Sowas macht man auf jeden Fall serverseitig.

EDIT: allein schon wegen dem Datenverkehr.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

35 Beiträge seit 2006
vor 17 Jahren

Das stimmt - wäre aber auch eine Möglichkeit 😉
Falls du keine ASP Unterstützung hast, kannst du die Daten auch über den WebRequest an ein PHP Script schicken und anschließend die Ausgabe (die vom PHP Script nach Auswertung des Keys erfolgt) einlesen.

we love C#...

W
wurstpeter Themenstarter:in
76 Beiträge seit 2006
vor 17 Jahren

Okay 😉
vielen Dank für die schnellen Antworten, ich habe keine .asp unterstützung.

Wenn ich mir die Sachen so anschaue, mit php script den key auswerten und so

wäre es mir doch lieber das ganze doch über eine Datenbank zu machen.
Ist ja eigentlich viel komfortabler und besser erweiterbar, vor alleim um Benutzer + KEy einzutragen.

Habt ihr da einen Vorschlag, dass zu machen?

35 Beiträge seit 2006
vor 17 Jahren

Hm... also ich find die Variante mit PHP eigentlich garnicht so kompliziert... hier ein Beispiel:

Hier die Klasse und ein Beispielaufruf wie du exemplarisch zwischen PHP und C# kommunizieren kannst:


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

public class URLTunnel
{
    /// <summary>
    /// Liest den Inhalt einer URL ein und gibt ihn aus
    /// </summary>
    /// <param name="url">Adresse</param>
    /// <returns>String Eingelesene Adresse</returns>
    public static string PostGetURL(string url)
    {
        return PostGetURL(url, "");
    }

    /// <summary>
    /// Schickt Daten per POST an eine URL, liest ihren Inhalt ein und gibt ihn aus
    /// </summary>
    /// <param name="url">Adresse</param>
    /// <param name="postData">Daten in Form: key=value&key2=value2...</param>
    /// <returns>String Eingelesene Adresse</returns>
    public static string PostGetURL(string url, string postData)
    {
        try
        {

            WebRequest request = WebRequest.Create(url);

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";

            if (postData != "")
                StreamToWebRequest(request, postData);

            WebResponse webResponse = request.GetResponse();

            StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.Default);
            return sr.ReadToEnd();
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }

    /// <summary>
    /// Sendet Daten an eine URL
    /// </summary>
    /// <param name="request">Verweis auf ein WebRequest</param>
    /// <param name="data">Daten, die gesendet werden sollen</param>
    private static void StreamToWebRequest(WebRequest request, string data)
    {
        byte[] bytes = null;
        bytes = System.Text.Encoding.Default.GetBytes(data);
        request.ContentLength = bytes.Length;
        Stream outputStream = request.GetRequestStream();

        outputStream.Write(bytes, 0, bytes.Length);

        outputStream.Close();
    }
}

/* Hier ein Beispiel für den Aufruf der Klasse */
public Form1 : Form
{
    public Form1() {
        string check = Convert.ToBoolean( URLTunnel.PostGetURL("http://meinspace.de/check_key.php", "key=" + textBox.Text) );
        if(check)
            MessageBox.Show("Key gültig.");
    }

        
}

Hier die PHP Datei:
[php]
<?php

/* Datei: check_key.php */

$found = "false";
$file = "keys.txt";
$keys = file($file);
foreach($keys as $key) {
if($key == $_POST['key']) {
$found = "true";
break;
}
}
echo $found;

?>
[/php]

we love C#...

W
wurstpeter Themenstarter:in
76 Beiträge seit 2006
vor 17 Jahren

Hey 😉

vielen Dank für den Code, hat mir schon einiges weitergeholfen:

Mein Problem liegt aber hier:


  bool check = Convert.ToBoolean( URLTunnel.PostGetURL("http://meinspace.de/check_keys.php", "key="+this.keyfield.Text) );
        if(check)
        {
            MessageBox.Show("Key gültig.");
            execute = true;
        }
        else
        {
          MessageBox.Show("Key ungültig.");
          execute = false;
        }

So sieht das bei mir aus.

Ich bekomme jetzt aber immer, auch bei gültigen keys, nen false return von der php datei.
Schon mehrere Sachen Probiert, komme aber nicht zum Ergebniss 🙁

Und wenn jemand ne Lösung für die Database variante hat wär das natürlich am besten 😉

35 Beiträge seit 2006
vor 17 Jahren

Wie stellst du dir denn eine Datenbank Lösung überhaupt vor?
Du würdest m.E. theoretisch eine DB auf dem Server anlegen und dann genau die gleiche Prüfung durchführen wie mit dem keyfile.

Zu dem Problem mit return = false. Das könnte an der Konfiguration des Servers liegen. Erstell mal eine Datei mit dem Inhalt
[php]<?php var_dump($_GET); ?>[/php]
und rufe sie dann mit einem get Parameter auf: http://meinedomani.de/datei.php?test=test

Wenn das File auch lediglich ein bool(false) zurückgibt, dann ersetze deine aktuelle check_key.php durch folgende:
[php]<?php

/* Datei: check_key.php */

$found = "false";
$file = "keys.txt";
$keys = file($file);
foreach($keys as $_key) {
if($_key == $key) {
$found = "true";
break;
}
}
echo $found;

?>[/php]

we love C#...

S
1.047 Beiträge seit 2005
vor 17 Jahren

@wurstpeter
wenn du die abfragen über eine datenbank machen möchtest sieht das im endeffekt genauso wie mit der datei aus...
du spricht in der regel nicht die datenbank direkt an, das ist bei den meisten webanbietern sowieso untersagt

man geht eher den weg das man einen webservice oder ein script aufruft, und diese führen intern alle benötigten schritte durch und geben dir dann ein resultat zurück

W
wurstpeter Themenstarter:in
76 Beiträge seit 2006
vor 17 Jahren

Okay 😉
hab mir das nochmal überlegt, theoretisch ist mir das im Moment egal ob Datenbank oder nich 😉
habs einigermaßen verstanden...

die datei.php gibt mir folgendes aus:

array(1) { ["test"]=> string(4) "test" }

Und es klappt auch mit dem anderen .php code nich,
wenn ich mich einloggen will bekomme ich immer, dieser Key ist ungültig...

Meine keys.txt sieht etwa so aus:

0987654321
1111111111
1234567890
2222222222
2222222220

W
wurstpeter Themenstarter:in
76 Beiträge seit 2006
vor 17 Jahren

nochmal in anderen Foren gesucht, aber zu keinem Ergebniss gekommen:

und bei der webrequest methode von dir (1. post)


HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pathVersInfoServ);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
while(!sr.EndOfStream) {
    if(versLokal == Convert.ToDouble(sr.ReadLine()))
    {
        execute = true;
        break;
    }
   
}
sr.Close();
response.Close();

bekomme ich den Fehler:




System.IO.Streamreader does not contain a definition for EndOfStream (CS0117)

wär aber schöner das mit der php methode zu lösen,...
was irgendwie auch net klappt

mfg

peter

35 Beiträge seit 2006
vor 17 Jahren

Ach, ich idiot... änder mal die php Datei in folgendes um:

[php]
<?php

/* Datei: check_key.php */

$found = "false";
$file = "keys.txt";
$keys = file($file);
foreach($keys as $key) {
if(trim($key) == trim($_POST['key'])) {
$found = "true";
break;
}
}
echo $found;

?>
[/php]

Das Problem könnte daran liegen, dass in der zeilenweise eingelesenen keys.txt an jeder Datei noch ein \n vorhanden ist. Mit der Funktion trim() kriegst du alle Leerstellen am Anfang und Ende eines Strings raus.

we love C#...

W
wurstpeter Themenstarter:in
76 Beiträge seit 2006
vor 17 Jahren

Hach 😉
wunderbar es läuft

Danke dir 1000fach für die hilfe