8 messaggi dal 10 febbraio 2003
Buongiorno a tutti,
invio ad un metodo Wcf 'value='pippo'
lato Wcf:
********************** wcf ****************************
Interfaccia:
[ServiceContract( )]
public interface IMovimentazioneRD_Ajax
{

//[OperationContract]
[WebInvoke(Method="GET", RequestFormat= WebMessageFormat.Json, ResponseFormat= WebMessageFormat.Json )]
string ImportaDocumento_ajx( String value );

}

Parti Salienti del WebConfig:

<services>
<service name="WcfService1.Service1">
<endpoint address="ajax" behaviorConfiguration="NewBehavior0"
binding="webHttpBinding" bindingConfiguration="NewBinding0"
name="WebHttp" contract="WcfService1.IMovimentazioneRD_Ajax">

<identity>
<dns value="sicwcf.tcda.it"/>
</identity>
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://sicwcf.tcda.it" />
</baseAddresses>
</host>
</service>
</services>
....
<behaviors>
<endpointBehaviors>
<behavior name="NewBehavior0">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" helpEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
....
<bindings>
<webHttpBinding>
<binding name="NewBinding0"
crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>

/***************************************************************/
/********************** client ****************************/

$.ajax({
traditional:true,
timeout: 10000,
type: "POST",
contentType: "application/json; charset=utf-8",
url: "http://xxx/wcfservice1/service1.svc/ajax/importaDocumento_ajx",
dataType: "jsonp",
data: { value: "pippo" },
success: function (dataRitorno, textStatus, jqXHR)
{
alert('ok');
}
},
error: function (jqXHR, textStatus, errorThrown)
{
alert('errore' + textStatus);
}

});
/***************************************************************/

in pratica con WebInvoke=GET funziona fino a quando lascio in value 'pippo', ma quando iunnserisco una stringa di circa 200 caratteri mi restituisce parseerror.

quindi ho pensato di dare WebInvoke=POST. rilancio il tutto ma mi va in errrore con PARSEERROR. questo anche se in value ci rimetto solo 'pippo'.

quindi con POST nn riesco a spuntarla.
ma come devo fare per passare al server una mole di caratteri consistenti?
forse devo fare qualcosa in IIS7

grazie a tutti!
mic
Modificato da micbin il 23 settembre 2011 15.20 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

micbin ha scritto:
ma come devo fare per passare al server una mole di caratteri consistenti?

stai facendo bene, infatti con una richiesta di tipo POST puoi fornire una maggior quantità di dati al servizio. Il problema che ottieni è causato da un formato dati che il server non si aspetta. Mi spiego meglio, guarda qui:

data: { value: "pippo" },
Se a "data" assegni un oggetto javascript, jQuery nel creare il contenuto della richiesta POST serializzerà quell'oggetto così:

value=pippo
Puoi verificarlo usando Firebug o un altro tool che ti permetta di ispezionare il traffico http.

Il metodo del tuo servizio, tuttavia, si aspetta una stringa JSON (dato che l'hai decorato con l'opzione RequestFormat=WebMessageFormat.Json) e nel tentativo di parsare i dati solleverà un'eccezione. Allora, risolvi in questo modo, assegnando a "data" una vera stringa JSON:

data: '{ "value": "pippo" }',
Così dovrebbe andare. In alternativa, se preferisci continuare a lavorare con gli oggetti javascript, puoi lasciare che sia il plugin JSON Encoder di jQuery a fare la serializzazione JSON per te. Lo utilizzeresti in questo modo:

data: $.JSON.encode({ value: "pippo" }),
In ultimo, tieni presente che anche con la POST esiste un limite di default di 8kb (se non ricordo male?), ma puoi facilmente riconfigurare questo limite dal web.config. Leggi qui:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/9ec67e8a-283e-4a6c-8d91-f89b0bd10dca/

ciao,
Modificato da BrightSoul il 23 settembre 2011 20.04 -

Enjoy learning and just keep making
8 messaggi dal 10 febbraio 2003
Ciao,
grazie per tutto.
Ho risolto, infatti funziona tutto perchè sia la pagina che il servizio sono nello stesso dominio.
adesso però,ed è ciò che mi servirebbe, la pagina risiede su dominio diverso. Ho modificato il dataType: "json" in dataType: "jsonp" ma non mi funziona più (sempre parse error).
cos'altro devo fare?

ancora grazie

mic
11.886 messaggi dal 09 febbraio 2002
Contributi

la pagina risiede su dominio diverso


Questo è un problema se vuoi fare una richiesta POST. XmlHttpRequest, l'oggetto usato per le richieste Ajax, è soggetto alla Same origin policy e pertanto non può effettuare richieste ad altri domini.

Per aggirare questo ostacolo, jQuery utilizza un'altra tecnica che consiste nell'aggiungere dinamicamente un tag <script /> alla pagina. Infatti il tag <script> ha una policy meno restrittiva e può referenziare file javascript anche da altri domini.

Quindi, un tag <script> causerà una richiesta GET da parte del browser. Non credo ci sia un modo di fargli fare una POST.

Quello che puoi fare è scrivere un proxy, ovvero una pagina aspx (o un HttpHandler, meglio) che effettui lato server la richiesta al servizio WCF e poi scriva tale e quale la risposta che ha ottenuto. Così le tue chiamate Ajax saranno dirette sempre al medesimo dominio della pagina.

In alternativa, leggi questa draft sul Cross-Origin Resource Sharing del W3C. Definisce un meccanismo per effettuare delle richieste cross-site ma non ho approfondito l'argomento e non saprei dirti se questa via è percorribile.
Leggi anche questo:
http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

ciao,
Modificato da BrightSoul il 26 settembre 2011 14.17 -

Enjoy learning and just keep making
8 messaggi dal 10 febbraio 2003
Ciao,
ti ringrazio moltissimo per i tuoi suggerimenti.
La documentazione in rete fa pietà.
cmq dai tuoi consigli il mio collega ed io siamo arrivati alla stessa tua conclusione. Creare un servixio svc per utilizzarlo come proxy e speriamo bene.

ancora grazie
mic & co.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.