12. november 2008 - 14:02Der er
14 kommentarer og 1 løsning
Upload af fil
Jeg har lavet et program, hvori jeg kan uploade en fil til en server (IIS7). Til valg af lokal fil bruger jeg en FileUpload-kontrol. Til selve det at gemme objektet på serveren benytter jeg nogle klasser, som jeg selv har lavet. Jeg har lavet en WPF-applikation, hvor klasserne til at gemme filen på serveren virker. Men når jeg prøver gennem aspx, så får jeg fejlen:
Hvordan kan det være? Jeg har da slet ikke en reference til det bibliotek. Er det noget, jeg ikke har sat rigtigt op? Jeg har været inde og give alle brugere maksimale rettigheder, så jeg kan ikke se, hvor problemet skulle være.
Kommandoen, hvor jeg prøver at gemme filen på serveren med, er:
Program.saveFileOnServer(serverService, filNavn);
og den metode, som den kommando bruger er:
static public void saveFileOnServer(IService1 mathClient, string fileArg) { using (FileStream fs = new FileStream(fileArg, FileMode.Open)) { byte[] buffer = new byte[65000]; int bytesRead = 0; // iterate through the file filling a buffer and sending it to the service while ((bytesRead = fs.Read(buffer, 0, 65000)) > 0) { int lastIndexOfSlash = fileArg.LastIndexOf('\\'); string onlyFile = fileArg.Substring(lastIndexOfSlash); mathClient.AppendFile(onlyFile, buffer, 0, bytesRead); } } }
Det er som om, at FileUpload-kontrollen ikke peger på det bibliotek, hvor den pågældende fil ligger, men derimod peger på det bibliotek, hvor applikationen bliver afviklet i. Hvis jeg ikke er helt galt på den, hvordan løser jeg så dette?
Jeg har nu prøvet med FileUpload.save, hvor jeg angiver fulde lokale sti til hvor filen skal gemmes. Og det virker fint. Vil det så sige, at WCF ikke kan bruges til net-applikationer? Ikke engang aspx-sider, hvor man kan skrive "runat= server'"?
Alt kode i en aspx side bliver kørt på serveren, og den har ingen tilgang til klientens filsystem. Grunden til at det virker i en WPF app, er at WPF applikationer kører på klienten. Når du tilføjer en fileupload kontrol til en aspx side, bliver filen sendt med i din postback, og serveren har mulighed for at gemme filen.
WCF er et hjælpemiddel til kommunikation via forskellige protokoller. Selvom du bruger WCF bliver du stadig nød til at kende muligheder og begrænsninger på de protokoller der bliver brugt.
Tænk hvis du bare uden videre fra din server kunne hente en fil fra klienten! Så havde du fundet historiens største sikkerhedshuld i klientens browser!
Ja, det er selvfølgelig rigtigt. Men jeg troede nu, at netop WCF gav mulighed for kommunikation på den led, at hvis klienten vælger at tage brug af muligheden, så er der en åben kanal til data-transport.
Hvis du på klienten bruger WPF vil det virke, men det har du jo fundet ud af. Med hensyn til de andre ting du nævner, så ved jeg ikke nok om dem til at kunne svare på det, desværre.
Men når klienten kan sende data ud (requests m.m.), så kan klienten vel også sende data gennem bestemte kommunikations-kanaler, hvis sikkerheden tillader det?
Findes der ikke noget online dokumentation omkring dette emne?
Klienten kan sende data, så længe du har noget kode kørende på klienten som håndterer det. En webserver kan ikke requeste data fra en klient, da dette vil blive blokeret. En tommelfingerregel er, at klienten altid skal tage initiativet til en dataoverførsel.
Jeg kender desværre ikke noget online dokumentation omkring dette.
hvor client program kan være en browser og hvor server side script kan være en ASP.NET side med FileUpload kontrollen.
Client programmet kunne også være en desktop app skrevet i C# som er installeret på PC'en. Klasserne WebClient og (Http)WebRequest kan sende en HTTP POST request til din ASP.NET side som emulerer det browseren sender.
Af åbenlyse sikkerhedshensyn så kan man ikke bare lade noget kode embedded i en web side få fuld adgang til client PC'ens harddisk.
En rimelig almindelig måde at give den adgang på er via en signed Java applet. Når den kører så bliver brugeren promptet om man vil give den privs og hvis han svarer ja, så har den adgang til hard disken.
Man kan nemt lave en upload applet som bruger (Http)URLConnection klassen som uploader til din ASP.NET side.
Bemærk at det ikke er muligt at grante den nødvendige adgang på en Windows Vista maskine med UAC slået til !
Du kan godt erstatte simpel HTTP POST med SOAP/HTTP. Server er så ikke en ASP.NET side med FileUpload kontrol, men en WCF web service med den rette binding. Client kan så være en C# desktop app med stub genereret af WCF - eller noget lavet i et andet sprog.
Men: - du kan ikke bruge din ASP.NET side kode - det løser ikke client side privs problemet - SOAP/HTTP er mindre egnet end simpel HTTP POST til at uploade filer med så jeg kan ikke se nogen pointe i at bruge WCF.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.