2009-04-03 6 views
7

Ho un semplice servizio Web per consentire alle applicazioni di interrogare il mio CMDB. La funzione che ho problemi con funziona con un piccolo set di risultati, ma fallisce con uno più grande, indicando che si tratta di qualcosa nella configurazione del servizio WCF che ne impedisce il successo.Non riesco a capire il messaggio di errore WCF, aiuto necessario

Ho una semplice app di test WinForms con un riferimento di servizio al servizio web e una singola funzione che chiama la funzione in questione.

Il set di risultati più piccolo restituisce ~ 120 KB di xml, il set di risultati più ampio non riuscito è ~ 2 MB. Ho provato ad aumentare le dimensioni di maxReceivedMessageSize e maxStringContentLength senza successo.

C'è qualche configurazione che ho perso? Mi sarei aspettato un messaggio di errore più dettagliato se quello era il problema.

Grazie in anticipo,

Nick


L'errore il è viene restituito:

System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. ---> 
System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ClientReliableChannelBinder`1.RequestClientReliableChannelBinder`1.OnRequest(TRequestChannel channel, Message message, TimeSpan timeout, MaskingMode maskingMode) 
    at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode) 
    at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at TestRig.CmdbDataService.ICmdbDataService.GetMonitors(String client) 
    at TestRig.CmdbDataService.CmdbDataServiceClient.GetMonitors(String client) in C:\Documents and Settings\nfoster\My Documents\Visual Studio Projects\Virtual Operations Manuals\Trunk\src\TestRig\Service References\CmdbDataService\Reference.vb:line 1480 
    at TestRig.Form1.btnGetServers_Click(Object sender, EventArgs e) in C:\Apps\Virtual Operations Manuals\Trunk\src\TestRig\Form1.vb:line 8 

La funzione chiamante nell'applicazione è:

Private Sub btnGetMonitors_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetMonitors.Click 
    txtResults.Text = String.Empty 
    Dim proxy As CmdbDataService.CmdbDataServiceClient = Nothing 
    Try 
    proxy = New CmdbDataService.CmdbDataServiceClient("WSHttpBinding_ICmdbDataService") 
    Dim monitors As TestRig.CmdbDataService.ConfigurationItems = proxy.GetMonitors(txtClientName.Text) 
    proxy.Close() 
    For Each monitor In monitors 
     txtResults.Text &= monitor.Name & " (" & monitor.TypeName & ")" & vbCrLf 
    Next 
    txtResults.Text &= monitors.Count & " monitors returned" 
    Catch ex As Exception 
    If Not IsNothing(proxy) AndAlso proxy.State <> ServiceModel.CommunicationState.Closed Then proxy.Abort() 
    txtResults.Text = ex.ToString 
    Finally 
    proxy = Nothing 
    End Try 
End Sub 

On il t est lato rig app.config contiene le seguenti ServiceModel:

<system.serviceModel> 
    <diagnostics> 
     <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <behaviors /> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="WSHttpBinding_Default" closeTimeout="00:05:00" 
      openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00" 
      maxBufferPoolSize="104857600" maxReceivedMessageSize="104857600"> 
      <readerQuotas maxDepth="104857600" maxStringContentLength="104857600" 
      maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" /> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/CmdbServices/DataService.svc/soap12" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_Default" 
     contract="CmdbDataService.ICmdbDataService" name="WSHttpBinding_ICmdbDataService"> 
     <identity> 
      <userPrincipalName value="MyMachine\ASPNET" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

e sul lato di servizio web.config è:

<system.serviceModel> 
    <diagnostics performanceCounters="Default"> 
     <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="MyCorp.Cmdb.Services.DataService.CmdbDataService"> 
     <endpoint address="soap12" binding="wsHttpBinding" contract="MyCorp.Cmdb.Services.DataService.ICmdbDataService" /> 
     <endpoint address="soap11" binding="basicHttpBinding" contract="MyCorp.Cmdb.Services.DataService.ICmdbDataService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

vorrei provare ad aumentare i valori di timeout. –

risposta

15

Un mio collega mi ha appena indirizzato a this blog post dove il vero colpevole è la proprietà maxItemsInObjectGraph nei comportamenti endpoint.

Urtando questi in su ha risolto il problema, devo aver appena superato la soglia predefinita di 65536: D

Bello vedere i messaggi di errore che puntano nella giusta direzione :(

Cin cin .. ..

anche:. si potrebbe ottenere questo errore perché uno dei metodi web utilizzano classe che non è una classe [DataContract]

+0

Web Archive del post del blog: http://web.archive.org/web/20071013175610/http://blogs.conchango.com:80/merrickchaffer/archive/2007/09/19/WCF-System.Net.WebException_3A00_-The-underlying-connection-was-closed_3A00_-The-connection-was-closed-unexpectedly.aspx –

0

AGGIORNAMENTO: OK, vedo che hai già tracing acceso . Hai guardato le tracce della WCF?

+0

Ho dato un'occhiata alle tracce ma le trovo davvero difficili da decodificare, WCF non è la mia area principale. L'eccezione è elencata qui ma i dettagli sono esattamente come nell'eccezione originale :( – Nick

0

tenta di aggiungere questa cattura nel codice lato client:

catch (CommunicationException commProblem) 
{ 
    Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace); 
    Console.Read(); 

}