WCF: Probleme mit one-way-Rückrufe
Ich bekomme immer diese rätselhaften Fehler bei Aufruf eines one-way-Rückruf um einen WPF-client, die von einem WCF service.
Die Nachricht konnte nicht übertragen werden
innerhalb der vorgegebenen timeout von
00:01:00. Es war kein Platz vorhanden
in der sicheren Kanal übertragen
Fenster. Die Zeit teilte zu diesem
die Bedienung war möglicherweise ein Teil eines
mehr timeout.
Es nicht senden zu viele Daten, nur eine Liste von Zeichenketten, die aus nur einem einzigen, kurzen Zeichenfolge innerhalb.
Mein server hat folgende config:
<xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="RawDealService.GameService">
<endpoint address ="" binding="wsDualHttpBinding" bindingConfiguration="basicConfig" contract="MyService.IGameService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
</services>
<bindings>
<wsDualHttpBinding>
<binding name="basicConfig" messageEncoding="Text">
<security mode="None"/>
</binding>
</wsDualHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Und mein client hat folgende config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IGameService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" />
<security mode="None">
<message clientCredentialType="Windows" negotiateServiceCredential="true" />
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:44259/GameService.svc" binding="wsDualHttpBinding"
bindingConfiguration="WSDualHttpBinding_IGameService" contract="IGameService"
name="WSDualHttpBinding_IGameService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
</startup>
</configuration>
Seine nur unverständlich, dass dies passieren könnte, da die Nachricht relativ klein ist und der Rückruf ist nur eine Möglichkeit. Sollte ich versuchen, einige verschiedene Bindungen?
- Können Sie Ihre Service-Interface-Klasse(auch Callback-interface)
- Siehe unten. Ich habe das problem gefunden, kann aber nicht akzeptieren, meine Antwort bis morgen. Trotzdem danke!
- Ihr herzlich willkommen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich das Problem entdeckt, und von seiner unglücklichen, die diese bestimmte Fehlermeldung geschickt, mich auf einen völlig falschen Weg.
Meine DataContract-setup hatte einige Klassen mit Vererbung in es, und ich hatte nicht richtig gekennzeichnet für
KnownType
s.Meine Vermutung ist, dass irgendwann der client hat versucht, de-serialisiert ein Objekt zugeordnet und sind gescheitert. Der Fehler muss nicht behandelt wurden ordnungsgemäß durch den Rahmen, und es vielleicht immer wieder versucht zu senden, über und über, und erhielt keine Reaktion nach einer minute.
Vielleicht hätte ich ein zwei-Wege-Anruf, den ich bekommen hätte ein informativer stack-trace.
Es riecht nach einer Sperrung/threading-Problem eher als ein Netzwerk-Problem.
Durch Zufall sind Sie dabei jede Art von blockieren/warten auf den one-way-Nachricht empfangen zu werden, auf dem client? Wenn dem so ist, und Sie sind mit der Synchronisierung Kontext, Sie sind Deadlocks WCF - Blockierung der message queue warten auf die Nachricht, während die Nachricht kann nicht erhalten werden, bis die Nachrichten-queue ist entsperrt.
Wenn dies der Fall ist, müssen Sie entweder
UseSynchronizationContext=false
auf Ihrem client, oder vermeiden Sie die Blockierung während des Wartens auf die Nachricht zu empfangen sein.Sagte, ich don ' T haben eine Tonne von Erfahrung mit WsDualHttpBinding.