2009-04-03 10 views
7

J'ai un service Web simple pour permettre aux applications d'interroger ma CMDB. La fonction avec laquelle je rencontre des problèmes fonctionne avec un petit resultset mais échoue avec une plus grande, indiquant que c'est quelque chose dans la configuration du service WCF qui l'empêche de réussir.Impossible de comprendre le message d'erreur WCF, aide nécessaire

J'ai une application de test WinForms simple avec une référence de service au service Web et une seule fonction qui appelle la fonction en question. Le plus petit jeu de résultats renvoie ~ 120 Ko de XML, le plus grand jeu de résultats est ~ 2 Mo. J'ai essayé d'augmenter la taille de maxReceivedMessageSize et de maxStringContentLength sans succès.

Y at-il une config que j'ai raté? Je m'attendais à un message d'erreur plus détaillé si c'était le problème.

Merci à l'avance,

Nick


L'erreur l'est renvoyée est:

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 fonction d'appel dans l'application est:

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 

sur le t côté plate-forme est Le app.config contient les ServiceModel suivants:

<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> 

et sur le côté service du web.config est:

<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

Je voudrais essayer d'augmenter les valeurs de délai d'attente. –

Répondre

15

Un de mes collègues vient de m'indiquer à this blog post où le véritable coupable est la propriété maxItemsInObjectGraph dans les comportements de point de terminaison.

supplantation ces up a résolu le problème, il faut que je viens de passer sur le seuil par défaut de 65536: D

Nice voir les messages d'erreur que vous pointent dans la bonne direction :(

Vive .. ..

aussi: Vous pouvez obtenir cette erreur parce que l'un de vos méthodes Web utilisent la classe qui n'est pas

+0

Archive Web de l'article de 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

MISE À JOUR: OK, je vois que vous avez déjà le traçage sous tension . Avez-vous regardé les traces WCF?

+0

J'ai regardé à travers les traces mais je les trouve vraiment difficiles à décoder, WCF n'est pas mon domaine principal. L'exception est répertoriée ici, mais les détails sont exactement les mêmes que dans l'exception d'origine :( – Nick

0

Essayez d'ajouter cette prise dans le code côté client:

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

} 
Questions connexes