2011-01-25 8 views
7

Esiste un modo per caricare un file dal filesystem locale a una cartella in un server utilizzando i servizi Web ASMX (no WCF, non chiedere perché :)?Caricamento file ASMX

UPD dimensioni

PsFile può essere 2-10 GB

risposta

2

Durante lo sviluppo del mio strumento gratuito per caricare file di grandi dimensioni su un server, utilizzo anche .NET 2.0 e servizi Web.

Per rendere l'applicazione più tollerante agli errori per file di grandi dimensioni, ho deciso di non caricare un grande array ma invece di eseguire un caricamento "saltato".

I.e. per caricare un file da 1 MB, richiamo la mia funzione SOAP di upload per 20 volte, ogni chiamata passa una matrice byte[] di 50 KB e concatenandola di nuovo sul server.

Conteggio anche i pacchetti, quando si rilascia, provo a caricarlo di nuovo per diverse volte.

Ciò rende il caricamento più tollerante agli errori e più reattivo nell'interfaccia utente.

Se sei interessato, this is a CP article of the tool.

+1

Ci ho pensato. ma ho anche pensato che questo potrebbe causare un gran numero di bug :) – 2xMax

+0

Sì, ci è voluto un po 'di tempo per renderlo una cosa rotonda. –

9

Certo:

[WebMethod] 
public void Upload(byte[] contents, string filename) 
{ 
    var appData = Server.MapPath("~/App_Data"); 
    var file = Path.Combine(appData, Path.GetFileName(filename)); 
    File.WriteAllBytes(file, contents); 
} 

quindi esporre il servizio, la generazione del proxy client dal WSDL, richiamare, roba standard .

-

UPDATE:

vedo l'aggiornamento ora sulla gestione di file di grandi dimensioni. Lo MTOM protocol with streaming integrato in WCF è ottimizzato per la gestione di tali scenari.

+0

buffer ??? Penso che voglia dire contenuti ... – scartag

+0

e che dire dei grandi file? – 2xMax

+0

@scartag, sì è quello che intendevo. –

0

Per file di grandi dimensioni, l'unico modo efficace per inviarli ai servizi Web è con MTOM. E MTOM è solo supported in WCF, che hai escluso. L'unico modo per farlo con i servizi web .asmx di vecchio stile è la risposta che @Darin Dimitrov ha dato. E con questa soluzione, dovrai subire il costo del file codificato in Base64 (il 33% in più di larghezza di banda).

0

Abbiamo avuto lo stesso requisito, fondamentalmente caricando un file tramite HTTP POST utilizzando i controlli standard FileUpload sul lato client. Alla fine abbiamo appena aggiunto una pagina ASPX al progetto del servizio web ASMX (dopotutto è solo un progetto web) - questo ci ha permesso di caricare su http://foo/bar/Upload.aspx quando il servizio web era http://foo/bar/baz.asmx. Ciò mantenne la funzionalità all'interno del servizio web, anche se stava usando una pagina web separata.

Questo potrebbe o potrebbe non adattarsi alle tue esigenze, l'approccio @Darins potrebbe funzionare come soluzione alternativa, ma dovresti apportare modifiche sul lato client per quello, che non era un'opzione per noi.