2009-12-01 18 views
5

Possiedo un'applicazione Silverlight 3, che il 95% delle volte richiede con successo i dati da un servizio WCF (nella stessa webapp) e visualizzandoli.Silverlight 3 Servizio WCF `CommunicationException` Errore restituito dal server: NotFound

Questo accade raramente, di solito se colpisco il servizio un po 'di volte rapidamente, ma a volte capita su una singola richiesta.

Ogni tanto, se richiedo un sacco di transazioni in un breve periodo, ottengo una delle due eccezioni, entrambe si verificano nel file Reference.cs nello EndMyMethod(System.IAsyncResult result).

Esistono alcuni metodi e le eccezioni si verificano su qualsiasi numero. Il primo è un TimeoutException() che ho capito e ha senso, il secondo, che non riesco a ottenere è il "CommunicationException() non gestito dal codice utente: Il server remoto ha restituito un errore: NotFound."

ho messo try..catch blocchi sia arround il .MyMethodAsync() e nel gestore per MyMethodCompleted sia senza alcun risultato, come si verifica l'eccezione nel Reference.cs file generato.

Qualsiasi aiuto è molto apprezzato.

aggiornamento

Reference.cs- generata da "Add Service Reference"

public System.IAsyncResult BeginTogglePicked(string ID, string toggle, System.AsyncCallback callback, object asyncState) 
{ 
    object[] _args = new object[2]; 
    _args[0] = ID; 
    _args[1] = toggle; 
    System.IAsyncResult _result = base.BeginInvoke("TogglePicked", _args, callback, asyncState); 
    return _result; 
} 

public void EndTogglePicked(System.IAsyncResult result) 
{ 
    object[] _args = new object[0]; 
    // This is the line where the Exception is Thrown 
    base.EndInvoke("TogglePicked", _args, result); 
} 

Calling Codice-pickedIDs è una lista di stringhe, e userIDSelecting è una stringa definito nella parte superiore della procedura. L'Event Handler mdc_TogglePIckedCompleted è vuoto al momento.

MapDataClient mdc = new MyDataClient(); 
mdc.TogglePickedCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(mdc_TogglePickedCompleted); 

foreach (string id in pickedIDs) 
{ 
    mdc.TogglePickedAsync(id, userIDSelecting, mdc); 
} 

Update 2

Questo è il "InnerException" dalla CommunicationException: System.Net.WebException: The remote server returned an error: NotFound.

Non so se questo è più utile, dal momento che non fornisce alcun dettaglio in più. Come ho detto, questo accade in modo intermittente non ogni volta che chiamo un metodo di servizio. Vorrei anche sottolineare che la stessa chiamata funzionerà a volte e non altri, sto iniziando a pensare che questo problema sia dovuto al fatto che IIS non risponde alle mie chiamate di servizio, pensieri?

Aggiornamento 3

Quando dico intermiently, intendo truel intrmitent. Questo può verificarsi solo una volta nella sessione di un utente e può avvenire solo in una delle cinquanta sessioni. La sua non è una casa o tutto o niente. L'applicazione chiamante è ospitata all'interno dello stesso "sito web" del servizio WCF, quindi non credo che il problema sia un clintaccesspolicy.xml, ma potrei sbagliarmi.

+0

Invia il codice in modo che possiamo esaminarlo. –

+0

Il codice dal 'Reference.cs' generato, il mio codice chiamante o entrambi? – Nate

risposta

4

Il messaggio che si stanno ottenendo sono probabilmente una falsa pista :-(

Quando eccezioni servizio WCF interna sono gettati, questi saranno sempre si manifestano come server non trovato eccezioni in Silverlight UI. Questo perché la risposta HTTP è di tipo 500. Il miglior articolo che ho letto su questo è stato di David Betz - http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2 (questo è stato scritto per SL2, ma i concetti rimangono validi per SL3. "MAI" utilizzando le funzionalità Aggiungi riferimento servizio da VS - non è necessario seguire tutti i suoi consigli ;-))

In ogni caso, tornando alla domanda, è necessario convertire il tipo di risposta in 200 e analizzare l'eccezione nel messaggio. Questo può essere fatto usando un MessageInspector (nel servizio e nell'app SL).

Alcuni di questi approcci può sembrare abbastanza scoraggiante - prendere un po 'di tempo per capire questo - il concetto è fondamentale per WCF < -> SL applicazioni, e ha senso una volta che si ottiene :-)

Abbiamo usato questo con un sacco di successo dall'inizio dell'anno, quindi se hai bisogno di ulteriore aiuto, fammelo sapere.

0

Il servizio restituisce i dettagli delle eccezioni al client? Di default non lo fa. È possibile aggiungere il seguente attributo alla classe di servizio.

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class MyService ... 

È possibile che si stia verificando una sorta di eccezione lato server non visibile al client.

+0

Non ho quel codice, ma nel file web.config, ho restituito i dettagli di eccezione. Dovrò controllare cos'è la "InnerException", se è qualcosa. – Nate

+0

Domanda aggiornata con i contenuti di InnerException. – Nate

0

Assicurarsi di disporre di un file clientaccesspolicy.xml. Altrimenti si potrebbe ottenere quell'errore perché il file della politica non può essere trovato.

0

Ho avuto esattamente lo stesso problema di te - incubo assoluto, a volte funzionava e poi basta fermarsi.

Dopo aver letto il tuo post in precedenza ho continuato a cercare informazioni sul clientaccesspolicy e ho trovato questo (non ricordo dove), ma lo uso e ora funziona perfettamente!

Spero che lo sia anche per te :) Nel mio file mancavano i dettagli aggiuntivi nella sezione Consenti.

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="http://*" /> 
     <domain uri="https://*" /> 

     </allow-from> 


     <grant-to> 
     <resource include-subpaths="true" path="/"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 
+0

Domanda di aggiornamento, non credo sia un criterio di accesso client, poiché l'app SL e il WCF si trovano nella stessa app web di asp.net. Potrebbe ancora essere questo il problema? – Nate

1

Posso raccomandare sempre, sempre con Fiddler in esecuzione quando si lavora con Silverlight e WCF?

Problemi correlati