2009-12-16 25 views
8

Sto chiamando un servizio Web C# utilizzando il .net Service Model e occasionalmente questo servizio Web lancia Microsoft.SharePoint.SoapServer.SoapServerException. Posso rilevare questa particolare eccezione come FaultException nel mio codice client, ma non riesco a ottenere il messaggio di errore amichevole restituito dal servizio web utilizzando FaultException.Catching FaultException in WebServices

Di seguito è riportata la traccia di rete per il servizio Web in presenza di un'eccezione.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Server</faultcode> 
      <faultstring>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</faultstring> 
      <detail> 
       <errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Access to this Web site has been blocked. 
    Please contact the administrator to resolve this problem.</errorstring> 
       <errorcode xmlns="http://schemas.microsoft.com/sharepoint/soap/">0x81020071</errorcode> 
      </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Sono molto interessato a ottenere il contenuto tra il nodo errortring nella risposta sopra. Tuttavia dalla classe FaultException non riesco a recuperare il messaggio di errore sopra riportato. Significa che il framework .NET non deserializza correttamente la risposta sopra o sto usando la classe di eccezioni sbagliata qui.

L'unico messaggio di errore che potrei ottenere da FaultException è "Eccezione di tipo" Microsoft.SharePoint.SoapServer.SoapServerException "è stato lanciato" nient'altro.

Si prega di notare che non ho alcun controllo sul servizio web.

risposta

24

Dopo aver trascorso un po 'di tempo su questo sono stato in grado di trovare una soluzione, è possibile ottenere l'accesso al messaggio di eccezione utilizzando il seguente segmento di codice,

FaultException faultException = (FaultException)exception; 
MessageFault msgFault = faultException.CreateMessageFault(); 
XmlElement elm = msgFault.GetDetail<XmlElement>(); 

Grazie a tutti per le vostre risposte.

+0

Grazie, il codice mi ha appena dato un'idea di come risolvere il mio problema (dopo un paio d'ore di combattimento). Se stai invocando i metodi della classe proxy wcf tramite reflection, sii consapevole di quell'eccezione di riflessione clr throw con eccezione fault come inner. –

2

I servizi Web non utilizzano direttamente le eccezioni. Invece, restituiscono i difetti. Il WSDL ha lo scopo di descrivere i possibili errori, insieme al contenuto dell'elemento <detail/>. Sarà necessario esaminare il WSDL per determinare quale errore viene restituito all'utente.

Se l'errore è denominato SharePointFault, WCF lo tradurrà in un'eccezione denominata FaultException<SharePointFault>. Questa eccezione avrà probabilmente proprietà per errorstring e errorcode. Dovresti essere in grado di utilizzare tali proprietà per recuperare i valori inviati nel messaggio di errore.

+0

Hmm ... Non vedo questa descrizione nella definizione WSDL del servizio web. Tuttavia, se utilizzo il servizio Web di cui sopra come un normale riferimento Web (non come riferimento di servizio) posso rilevare l'eccezione di cui sopra come System.Web.Services.Protocols.SoapException e posso accedere ai messaggi di errore sulle proprietà OuterXml o InnerXml dell'oggetto System.Web.Services.Protocols.SoapException. – Shamika

+0

Se non ci sono wsdl: elementi di errore, quindi si è bloccato con l'utilizzo di http://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception.createmessagefault.aspx. –

+0

Sì, questa è l'unica opzione – Shamika