Laden...

In C# einen externen File-Server ansteuern, Dokumente ausgeben und Uploaden

Erstellt von -Rockbiest- vor 6 Jahren Letzter Beitrag vor 6 Jahren 6.207 Views
-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren
In C# einen externen File-Server ansteuern, Dokumente ausgeben und Uploaden

Beschreibung:

Hallo Zusammen, ich habe ein Problem!

Ich habe ein Webportal durchprogrammiert, welches bisher auch seine notwendigen Dienste erfüllt hat. Nun hat derjenige, für den ich das Webportal erstellt habe seine Strukturen geändert.

Bisher war das Programm auf einem Server gespeichert. Und der File-Server, auf dem die Dokumente gespeichert sind, die geöffnet werden sollen (und auf dem neue Dokumente gespeichert werden sollen) auf dem Server eingebunden.

Nun hat derjenige Zwecks Erhöhung der Datensicherheit die Verknüpfung zum File-Server entfernt und diesen ungebunden hinter eine FireWall gepackt. Nun funktioniert natürlich das ganze Konstrukt nicht.

Eine Idee, die man mir mit auf den Weg gegeben hat ist, den File-Server zu routen, das ist nur leider ein Thema mit dem ich mich noch nie beschäftigt habe, und daher leider keine Ahnung habe. Nachfolgend mein Code, wie ich ihn bisher verwendet habe:


protected void btnDokumentOeffnen_Click(object sender, CommandEventArgs e)
    {
        string connectionString = ConfigurationManager.ConnectionStrings["dataConnection"].ToString();
        SqlConnection conn = new SqlConnection(connectionString);

        conn.Open();
        SqlCommand commandDatei = new SqlCommand("SELECT fmv_doc_pfad FROM tbl_rpt_1100 WHERE fmv_doc_id = @fmv_doc_id", conn);
        commandDatei.Parameters.AddWithValue("@fmv_doc_id", (string)e.CommandArgument);
        string pfad = (string)commandDatei.ExecuteScalar();
        
        SqlCommand commandVerweis = new SqlCommand("SELECT pfad_adresse FROM tbl_sys_pfad_1000 WHERE pfad_nr = 12", conn);
        string verweis = (string)commandVerweis.ExecuteScalar();
        //New Code for Downloading file
        string filepath = verweis + pfad;   // DIES ERGIBT ZUSAMMEN DEN PFAD AUF DEM FILESERVER, WO DAS DOKUMENT LIEGT! DA DER FILESERVER ANGBUNDEN WAR, WAR DER NACHFOLGENDE CODE BISHER AUSREICHEND GEWESEN




        // Hier muss der Code rein, der die Verbindung durch die FireWall herstellt, um eine Datei weiterhin öffnen zu können!!!




        // Create New instance of FileInfo class to get the properties of the file being downloaded
        FileInfo file = new FileInfo(filepath);

        // Checking if file exists
        if (file.Exists)
        {
            // Clear the content of the response
            Response.ClearContent();

            // LINE1: Add the file name and attachment, which will force the open/cance/save dialog to show, to the header
            Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", file.Name));

            // Add the file size into the response header
            Response.AddHeader("Content-Length", file.Length.ToString());

            // Set the ContentType
            Response.ContentType = ReturnFiletype(file.Extension.ToLower());

            // Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
            Response.TransmitFile(file.FullName);

            // End the response
            Response.End();
        }
        else
        {
            string message = "No such file found on server!! Please check with the Administration!!";
            ClientScript.RegisterStartupScript(GetType(), "alert", "alert('" + message + "');", true);
        }


Schlagwörter: <C# FIREWALL ROUTEN DATEILOAD>

16.806 Beiträge seit 2008
vor 6 Jahren

Und was genau ist die Frage? Wo ist nun das Problem? Was hast Du versucht, wo kommst Du nicht weiter?

PS: in Zukunft bitte [Hinweis] Wie poste ich richtig? beachten und im richtigen Forum posten.
Du hast erst vor wenigen Minuten, vor dem erstellen dieses Thread, ein Hinweis bekommen, genau das durchzulesen und zu beachten.
Danke!

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren
Antwort

Hi.
Das Problem ist leider, dass mie gänzlich der Ansatz fehlt einen externen Server anzusteuern, der tudem hinter einer Firewall liegt!

16.806 Beiträge seit 2008
vor 6 Jahren

Eine potentielle Lösung ist alleine durch die Firewall gehemmt.
Ohne Firewall-Ausnahme kommst Du nicht durch. Das ist ja der Sinn einer Firewall.

Was Du mit "externer Server ansteuern" meinst; keine Ahnung.

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Natürlich muss in der Firewall eine Ausnahme rein aber das muss dann eben auch programmiert werden in C#, oder nicht?

Bisher hat der Pfad etwas in der Richtung ausgegeben:
F:/Pfad/document.pdf

Das war auch bis dato auskömmlich, da der file-server als Laufwerk auf dem Server eingebunden war, wo das Webportal hinterlegt ist. Nun muss ich den File-Server irgendwie rooten, weiß aber nicht wie.

16.806 Beiträge seit 2008
vor 6 Jahren

Ich versteh leider nicht, was Du mit "Routen" oder "File Server steuern" meinst.
Vielleicht versteht das ja irgendjemand anders, der Dir dann helfen kann...

Ohne jedenfalls manuell in die Firewall einzugreifen und eine Policy zu setzen, wirst Du jedenfalls kaum an den Fileserver kommen; weder über den Pfad noch über ein Socket.
Ansonsten wäre der Sinn einer Firewall nicht gegeben.

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Na bisher konnte ich die Dateien mit einem simplen Pfad (Beispiel: F:/Pfad/document.pdf) erreichen, weil das der reale Pfad, angebunden an den Server war, von dem aus das Webportal aus lief.

Jetzt ist der File Server ausgegliedert, also nicht mehr direkt an den Server gebunden. Dennoch will ich an die Dateien ran, den Fileserver also irgendwie anderweitig ansteuern, die Frage ist doch "nur" wie.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo -Rockbiest-,

entweder der Admin erlaubt ein Loch in der Firewall, so dass du* ein Netzlaufwerk einbinden kannst und so per \FileServer... zugreifen kannst. Nötige Ports musst du raussuchen

  • auf dem FileServer eine Web-Anwendung, die nur für für das "Streamen" der Dateien zuständig, laufen lässt und auf diesen dann z.B. per UrlRewrite (od. sonst eine reverse proxy Funktionalität) weiterleitest, dann ist nur TCP 80 freizugeben

  • du dir sonst einen Dienst für das Holen der Dateien schreibst, z.B. per WCF / TcpServer/Client / ... dann weißt du auch welche Ports freigegeben werden müssen

Der Aufwand steigt mit den unteren Punkten. Aber klär das mit dem Admin ab, der weiß ja was er zulassen kann und will.

Sonst wäre eine Erklärung hilfreich wie die Server-Architektur ausschaut, welche Betriebssysteme im Einsatz sind, etc. ganz hilfreich. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Das hört sich gut an!
Die dritte Variante ist denke ich das was gebraucht wird.
Die Ports und Rechte zu erhalten sollte kein Problem sein, da der Nutzer ja ein Interesse hat, dass dies wieder funktioniert 😄

Damit kann ich jetzt denke ich erst einmal arbeiten und schauen wie weit ich komme!

T
2.219 Beiträge seit 2008
vor 6 Jahren

@-Rockbiest-
Wenn der fileServer nur im internen Netzwerk verwendet wird, sollte eine einfache Dateifreigabe reichen.
Hier musst du nicht das Rad neu erfinden.
Wir nutzen bei uns ein ähnliches Konzept.
Altdaten werden dabei aus der DB auf eine Freigabe geschrieben und von dort auch wieder gelesen, wenn diese gebraucht werden.
Hier muss nur die entsprechende Freigabe angelegt werden und natürlich darf diese nur intern erreichbar sein.
Aber auch das sollte i.d.R. für den Admin der Server kein großes Problem darstellen, dies umzusetzen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Also grundsätzlich müsste ich das mit dem Server Admin klären.
Fakt ist der Server über das das Webportal läuft und der fileServer haben keinerlei Netzwerkverbindung mehr zueinander.

Wäre deine Anwendung an dieser Stelle denoch denkbar?
Ich habe nachfolgende Beschreibung gefunden, wäre dies eventuell zielführend und wie bekommen ich die Dokumentthematik hier abgebildet?

static void Connect(String server, String message) 
{
  try 
  {
    // Create a TcpClient.
    // Note, for this client to work you need to have a TcpServer 
    // connected to the same address as specified by the server, port
    // combination.
    Int32 port = 13000;
    TcpClient client = new TcpClient(server, port);

    // Translate the passed message into ASCII and store it as a Byte array.
    Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);         

    // Get a client stream for reading and writing.
   //  Stream stream = client.GetStream();

    NetworkStream stream = client.GetStream();

    // Send the message to the connected TcpServer. 
    stream.Write(data, 0, data.Length);

    Console.WriteLine("Sent: {0}", message);         

    // Receive the TcpServer.response.

    // Buffer to store the response bytes.
    data = new Byte[256];

    // String to store the response ASCII representation.
    String responseData = String.Empty;

    // Read the first batch of the TcpServer response bytes.
    Int32 bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    Console.WriteLine("Received: {0}", responseData);         

    // Close everything.
    stream.Close();         
    client.Close();         
  } 
  catch (ArgumentNullException e) 
  {
    Console.WriteLine("ArgumentNullException: {0}", e);
  } 
  catch (SocketException e) 
  {
    Console.WriteLine("SocketException: {0}", e);
  }

  Console.WriteLine("\n Press Enter to continue...");
  Console.Read();
}
D
985 Beiträge seit 2014
vor 6 Jahren

Fakt ist der Server über das das Webportal läuft und der fileServer haben keinerlei Netzwerkverbindung mehr zueinander.

Ähm, in dem Fall wird es unmöglich sein, dass diese beiden sich jemals unterhalten können.

Das widerspricht allerdings deiner Aussage im ersten Beitrag, wonach die beiden durch eine Firewall getrennt sind. Was bedeutet, dass es durchaus eine Netzwerkverbindung gibt, allerdings durch eine Firewall.

16.806 Beiträge seit 2008
vor 6 Jahren

Nur Code irgendwo kopieren und fragen "hey, klappt das bei mir"?
Das kann auch ein Maurer. Da muss man kein Entwickler sein.

Du musst jetzt schon mal rausrücken, was Du da eigentlich basteln willst.
Weil so stimmen Aussagen und Code null miteinandern.

Warum Du nicht einfach die Shares in der Firewall für eine Maschine freigeben kannst (aber wohl für nen WCF Dienst?! 🤔 ) und bei der alten Variante bleibst, bleibt immer noch ein absolutes Rätsel.

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Verzeihung das war natürlich falsch.
Die Server sind in einem Netzwerk durch eine Firewall von einander getrennt.
Mir wurde mit auf den Weg gegeben, dass vermutlich ein TcpListener zielführend sein sollte.

16.806 Beiträge seit 2008
vor 6 Jahren

Mir wurde mit auf den Weg gegeben, dass vermutlich ein TcpListener zielführend sein sollte.

Hat der jenige einfach was gesagt oder sich das Problem vollständig angehört?
Ohne Authentifizierung auf ein externen Dienst zugreifen, der dann auch noch hinter ner Firewall sitzt: völlige Untergrabung der Security.

Du könntest Dir all den Umstand sparen, wenn Du einfach wieder das Netzlaufwerk mit einem Benutzer mappst und die Firewall dies für eine Maschine freigibt.

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

um mal die letzte Frage zu beantworten, ob der gefundene Code verwendet werden kann:
Aller Wahrscheinlichkeit nach nicht - es sei denn, alle Deine Dokumente sind in ASCII - das Stück Code arbeitet mit diesem Encoding. Du müsstest aber binär arbeiten, wenn das mit verschiedenen Dokumettypen klappen soll.

data = new Byte[256];

halte ich für eine Dokumenten übertragung auch nicht gerde für eine geeignete Größe.

Aber mal im Ernst: Ihr wollt eine eigene - dann auch möglicherweise fehlerbehaftete - Lösung schreiben, um ein Problem zu lösen, das in meinen Augen gar nicht existiert, bzw. mit vorhandenen Technologien viele einfacher zu lösen ist. Wo ist der Unterschied, die Firewall für die Netzwerkfreigabe aufzumachen, oder für einen eigenen Service?

Absichern dann wie Abt schreibt über Benutzerrechte.
Vielleicht muss tDu auch gar nicht das Laufwerk mappen (falls das das Problem ist), sondern kannst über UNC-Pfad zugreifen.

Gruß, MarsStein

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

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Derjenige hat sich das Problem angehört, bzw. dieses überhaupt erst geschaffen 😄

Wäre dann eventuell folgender Lösungsversuch zielführend?

        
string server = @"\\servernamex123\datenverzeichnis$";
string username = "Username"; //nicht hartkodiert, sondern über Abfrage DB
string pw = "PW"; //nicht hartkodiert, sondern über Abfrage DB

MapNetworkDriveConnect("L:", server, username, pw);



private void MapNetworkDriveConnect(string drive, string server, string user, string password)
    {
        Process p = new Process();
        p.StartInfo.FileName = "net";
        p.StartInfo.Arguments = string.Format("use {0} {1} /user:{2} {3}", drive, server, user, password);
        p.StartInfo.UseShellExecute = false;
        p.Start();
    }

Und im Anschluss dann den bestehenden Code, wie bisher:

// Create New instance of FileInfo class to get the properties of the file being downloaded
        FileInfo file = new FileInfo(filepath);

        // Checking if file exists
        if (file.Exists)
        {
            // Clear the content of the response
            Response.ClearContent();

            // LINE1: Add the file name and attachment, which will force the open/cance/save dialog to show, to the header
            Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", file.Name));

            // Add the file size into the response header
            Response.AddHeader("Content-Length", file.Length.ToString());

            // Set the ContentType
            Response.ContentType = ReturnFiletype(file.Extension.ToLower());

            // Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
            Response.TransmitFile(file.FullName);

            // End the response
            Response.End();

        }
        else
        {
            string message = "No such file found on server!! Please check with the Administration!!";
            ClientScript.RegisterStartupScript(GetType(), "alert", "alert('" + message + "');", true);
        }

T
2.219 Beiträge seit 2008
vor 6 Jahren

@-Rockbiest-
Das ist viel zu umständlich und nicht mal sauber ugmesetzt.
Der Webserver muss nur über den Benutzer, unter dem dein Web läuft, auch mit den gleichen Zugangsdaten auf dem Dateiserver Zugriff kriegen.
Dies muss nicht per Programmierung gelöst werden, sondern muss durch den Admin des Dateiservers eingerichtet werden.
Dann solltest du kein Problem haben normal auf die Freigabe zu kommen.
Dort brauchst du dann nicht mal ein Mapping sondern kannst direkt die Freigabe per smb ansprechen.
Machen wir bei uns auch, da alle anderen Ansätze nicht Zielführend wären.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Hallo Virus,

gilt der Lösungsansatz auch, bei der Trennung der zwei Server durch ine FireWall?
Der Administrator wird sich nicht darauf einlassen, etwas an dem Konstrukt mit der Firewall zu ändern.

Danke Vorab!

16.806 Beiträge seit 2008
vor 6 Jahren

Ohne Ausnahme in der Firewall funktioniert auch die andere Variante nicht.

Deine technische Anforderung - egal ob Share oder WCF Service - benötigt eine Verbindung von Extern auf die andere Seite der Firewall.
Dafür ist eine Firewall-Ausnahme nötig.

Wenn Deine IT das blockt, dann sag Deinem Chef, dass die gewünschte Funktion aufgrund der IT Beschränkung nicht umgesetzt werden kann und Dir die IT keine Alternativlösung anbietet.

T
2.219 Beiträge seit 2008
vor 6 Jahren

@-Rockbiest-
Was Abt schreibt, ist korrekt.
Dies gehört aber auch zu einem gewissen Grundsatz von Netzwerktechnik, den du kennen solltest.
Gerade wenn du mit C# und externen Systemen arbeitest, musst du immer die Firewall als Blockade beachten und dich mit der IT absprechen.

Also klär das Thema mit der IT und dann kannst du wie gehabt über eine Freigabe, die dann nur über eine interne Netz IP erreichbar sein sollte, arbeiten.
Das spart die eine Menge Zeit um eine eigene Lösung, die das gleiche macht, umzusetzen.w

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

M
184 Beiträge seit 2012
vor 6 Jahren

Mir wurde mit auf den Weg gegeben, dass vermutlich ein TcpListener zielführend sein sollte.

Wenn das von dem Admin gekommen ist, tippe ich darauf, er meint dass die Firewall keine eingehenden Verbindungen zum Fileserver zulässt, sehr wohl aber ausgehende Verbindungen vom FileServer...

T
2.219 Beiträge seit 2008
vor 6 Jahren

@MorphieX
Eher unwahrscheinlich, dass solche Infos nicht von einem Netzwerk Admin kommen.
Und selbst wenn, dann hätten hier noch weitere Informationen erfolgen müssen.
Z.B. welche Datenpakete gesendet/empfangen und verarbeitet werden müssen und auf welchen Port man lauschen muss.

Aber selbst diese Lösung würde bedeuten, dass Rad wieder neu erfinden zu müssen.
Hier muss extra ein Client gebaut werden, damit man einfach Dateien über das Netzwerk abfragen kann.
Also man genau das macht wozu eine Netzwerkfreigabe da ist.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

-
-Rockbiest- Themenstarter:in
10 Beiträge seit 2015
vor 6 Jahren

Ich würde gerne an die Diskussion vom letzten Mal anknüpfen. Ich bin bereits viele Schritte weiter. Eigentlich kurz vorm Ziel und scheitere doch.

Der Server / FileShare ist durch entsprechende Regeln auf dem Server eingebunden, wo die Applikation liegt.

Nun will ich eine Datei von dem FileShare über die Applikation aufrufen.
Dies läuft für gewöhnlich über:

FileInfo file = new FileInfo(Pfad);

Der Pfad ist der nachfolgende= "http://170.15.1.110/Ordner/Datei.pdf"

Das hat solange einwandfrei funktioniert, solange der Pfad ein lokaler war (Beispielsweise C:/ oder dergleichen). Nun über http:/IP funktioniert es nicht mehr, obwohl ich mir manuell das Ordnerverzeichnis aufrufen kann.

Habt ihr eine Idee, was hier noch berücksichtigt werden muss?

Vorab besten Dank.

16.806 Beiträge seit 2008
vor 6 Jahren

Using CasPol to Fully Trust a Share

PS: kein Mensch kann was mit "geht nicht" anfangen. Niemand.
[Hinweis] Wie poste ich richtig? Punkt 5

T
2.219 Beiträge seit 2008
vor 6 Jahren

@-Rockbiest-
Wäre mir neu, dass FileInfo mit http Links umgehen kann.
Was genau willst du damit machen?

Ich arbeite in einem Projekt auch mit Daten auf eine Sambs Freigabe.
Dort kann ich dann mit System.IO Klassen ohne Probleme arbeiten.
Ich verstehe nicht warum du nach 6 Monaten immer noch keinen lauffähig Ansatz hast.
Wenn die Rechte auf dem Fileserver richtige gesetzt sind, kannst du dort wie mit einer lokalen Platte arbeiten.

Wenn du schon eine Freigabe im Server eingebunden hast, wozu die Verrenkung mit http?
http kannst du mit .NET Bordmittel nur per WebRequests etc. ver-/bearbeiten.
Wenn du aber Daten hochschieben willst, ist das der falsche Ansatz.
Dann müsstest du weitere Verenkungen mit FTP etc. machen.
Und dann baust du dir ein undurchsichtiges unwartbares Monster.
Das willst du dann nie wieder anfassen.

Aber ohne aktuellen Code oder Erklärungen was du genau machst und vor hast, wird es schwierig hier hilfreiche Lösungen zu geben.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 6 Jahren

Das sehe ich jetzt erst.

FileInfo und Http ist natürlich totaler Quatsch.
Und CasPool und HTTP geht dann natürlich auch nicht.