Kann nicht verstehen, WCF Fehlermeldung, Hilfe benötigt
Habe ich eine einfache web-service, um Anwendungen zu meine Abfrage CMDB. Die Funktion habe ich bin Probleme mit, funktioniert mit einem kleinen resultset scheitert aber mit einem größeren, was darauf hinweist, dass es etwas in der WCF-service-config, die verhindern, dass es gelingt.
Habe ich eine einfache WinForms-test-app mit einer Service-Referenz auf den web service und eine einzelne Funktion, die ruft die Funktion in Frage stellen.
Den kleineren Ergebnismenge zurückgibt ~120KB von xml, die in Ermangelung größeren Ergebnismenge ist ~2MB. Ich habe versucht, die Erhöhung der Größe der maxReceivedMessageSize und maxStringContentLength ohne Erfolg.
Gibt es einige config habe ich verpasst? Ich würde erwarten, dass eine genauere Fehlermeldung, wenn das war das problem.
Vielen Dank im Voraus,
Nick
Den Fehler, der zurückgegeben wird, ist:
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
Die aufrufende Funktion in der Anwendung ist:
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
Auf dem Prüfstand-Seite der app.config enthält die folgenden 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>
und auf der service-Seite im web.config ist:
<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>
- Ich würde versuchen, die Erhöhung der timeout-Werte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Kollege von mir hat gerade wies mich an in diesem blog-post, wo der eigentliche Schuldige ist die Eigenschaft maxItemsInObjectGraph im Endpunkt Verhaltensweisen.
Stoßen diese bis das problem gelöst hat, ich muss nur übergeben über die Standard-Schwellenwert von 65536 😀
Schön zu sehen sind die Fehlermeldungen zeigen Sie in die richtige Richtung 🙁
Prost....
Auch: Sie können diese Fehlermeldung erhalten, weil einer Ihrer web-Methoden sind mit Klasse, die nicht eine
[DataContract]
Klasse.Diesem blog erklärt, wie die Einrichtung eines trace-listener, und verwenden Sie die svctraceviewer.exe.
http://tbszone.com/post/2010/11/16/WCF-The-connection-was-closed-unexpectedly.aspx
AKTUALISIERT: OK, ich sehe, Sie haben bereits die Ablaufverfolgung eingeschaltet. Haben Sie schaute auf die WCF-Spuren?
Versuchen diese zu fangen client-seitig code: