2011-01-20 6 views
7

SfondoCome aumentare la dimensione del POST per un servizio web ASMX?

Sto sviluppando un controllo lato server ASP.Net che ha bisogno di parlare con un servizio web ASMX. Il controllo lato server utilizza un oggetto WebClient per comunicare con il servizio Web, poiché deve essere riutilizzato spesso in varie applicazioni e per semplificare gli sviluppatori non è necessario creare un riferimento al servizio Web.

Attuazione

Durante l'utilizzo del controllo, si richiede l'invio di un oggetto serializzato al servizio web. L'oggetto viene serializzato utilizzando XmlSerializer e la stringa XML risultante viene quindi compressa utilizzando la libreria di compressione chilkat. La chiamata di servizio Web per il controllo si presenta come segue:

webClient.UploadStringAsync(new Uri(serviceHost + serviceMethod), "POST", sendData)

Il contenuto di sendData (string) è compressedResponse={CompressedData}.

Il servizio Web ha un metodo definito come segue per ricevere i dati e quindi decomprimere il valore della stringa utilizzando la libreria chilkat prima della serializzazione dell'oggetto utilizzando XmlSerializer.

public void SaveResponse(string compressedResponse)

La comunicazione tra il comando e il servizio sta lavorando. Inizialmente non c'erano impostazioni o vincoli definiti nello web.config per uno dei precedenti. Dopo la ricerca iniziale, ho aggiunto

<httpRuntime maxRequestLength="20480"/>

sia per il client e server web.config file. Questo non ha fatto differenza.

Problema

compresso o non compresso i dati da inviare al servizio web nella variabile sendData è di grande per una normale richiesta POST, e è danneggiato. Ciò viene confermato quando si controllano gli ultimi caratteri della stringa prima e dopo essere stati inviati al server in formato compresso e non compressi, mentre il documento Xml manca l'ultimo tag radice quando si effettua il check in del debugger. string non può essere decompresso e pertanto la chiamata di servizio non riesce ogni volta.

Come aumentare la dimensione POST per la richiesta WebClient per garantire che la stringa completa sia ricevuta dal server?

Ho esaminato le varie opzioni su Google, ma nessuna mi fornisce un campione sufficiente di informazioni su dove apportare le modifiche o esempi di ciò che le modifiche devono avere. Sono completamente perso sul fatto che la modifica debba essere apportata sul server o sul sito Web che consuma e, poiché non è stata definita alcuna associazione per questo, come creare un'associazione nello web.config per una chiamata di servizio HTTP ASMX.

+0

cosa ti fa credere che la stringa sia troppo lunga? Solo il fatto che non possa essere decompresso? Che aspetto ha in Fiddler? –

+0

@John Ho aggiornato la domanda con le informazioni. Effettuare un controllo di base sulla stringa compressa copiando gli ultimi caratteri prima del post e convalidandolo con la stringa pubblicata. Inoltre, l'invio del documento Xml non compresso mostra che il tag root finale è mancante e viene interrotto a metà strada durante il check-in del debugger. – BinaryMisfit

risposta

1

Non sembra esserci alcun modo per modificare le dimensioni POST per un servizio Web ASMX, quando solo HttpPost è abilitato.

La soluzione alla fine era quella di passare il servizio a HttpSoap in esecuzione e creare un riferimento di servizio all'assembly che contiene il controllo. Una volta eseguita, l'associazione viene creata utilizzando il codice nel controllo una volta che l'endpoint viene impostato tramite una proprietà.

6

Credo che si debba raggiungere il limite massimo di lunghezza richiesta di ASP.NET. Che è possibile modificare tramite file di configurazione come ad esempio:

<system.web> 
    <httpRuntime executionTimeout="240" maxRequestLength="20480" /> 
</system.web> 

valore maxRequestLength è in KB, così sopra impostazione permetterebbe 20 MB. Puoi anche applicare l'impostazione solo agli URL selezionati utilizzando il tag di posizione, ad es.

<location path="yourservice.asmx"> 
    <system.web> 
     <httpRuntime executionTimeout="240" maxRequestLength="20480" /> 
    </system.web> 
</location> 
+0

Avrei dovuto aggiungere alla domanda che ho già impostato sia per il client 'web.config' che per il server' web.config'. Ho aggiornato la domanda per riflettere questo. +1 tuttavia per la risposta dettagliata. – BinaryMisfit

+0

@Diago, hai qualche errore particolare? Puoi condividere questi dettagli? – VinayC

+0

@Diago, sono anche curioso di sapere come si convertono i dati compressi (presumibilmente in formato array di byte) in una stringa. È necessario applicare la conversione inversa dopo la ricevuta. Base64 sarebbe un buon candidato qui per codificare i dati compressi in stringa. – VinayC