Laden...

WCF: Fehler beim Empfangen der HTTP-Antwort …

Erstellt von henk vor 10 Jahren Letzter Beitrag vor 10 Jahren 10.105 Views
H
henk Themenstarter:in
15 Beiträge seit 2009
vor 10 Jahren
WCF: Fehler beim Empfangen der HTTP-Antwort …

Ich muss gestehen, dass ich ein wenig frustriert bin. Wir haben ein größeres Projekt, das von WebServices auf WCF umgestellt werden soll. In den WebFunktionen finden wir sämtliche sauerrein selbst DataSets mit out und ref Kennzeichen in den Funktionsparametern. Statisch DataSets wurden auf Array umgestellt, nur die dynamischen nicht. Bei Funktionen mit simplen Datentypen funktioniert alles reibungslos. Bei Funktionen mit einem DataSet als out Paramater bekomme ich folgende Fehlermeldung.

Fehlermeldung:
System.ServiceModel.CommunicationException was caught
HResult=-2146233087
Message=Die zugrunde liegende Verbindung wurde geschlossen: Eine Verbindung, deren Aufrechterhaltung erwartet wurde, ist vom Server geschlossen worden..
Source=mscorlib
StackTrace:
Server stack trace:
bei System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
bei System.ServiceModel.Channels.HttpChannelFactory1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) bei System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) bei System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) bei System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) Exception rethrown at [0]: bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) bei PAZ.Client.Server.PAZServiceWCFRef.IPAZService.Business_PrepareDataSet(Business_PrepareDataSetRequest request) bei PAZ.Client.Server.PAZServiceWCFRef.PAZServiceClient.PAZ.Client.Server.PAZServiceWCFRef.IPAZService.Business_PrepareDataSet(Business_PrepareDataSetRequest request) in d:\PAZ_TestClient_WCF\src\PAZ.Client.ServerWCF\Service References\PAZServiceWCFRef\Reference.cs:Zeile 3281. bei PAZ.Client.Server.PAZServiceWCFRef.PAZServiceClient.Business_PrepareDataSet(String userName, String module, String code, DataSet& dataSet) in d:\PAZ_TestClient_WCF\src\PAZ.Client.ServerWCF\Service References\PAZServiceWCFRef\Reference.cs:Zeile 3289. bei PAZ.Client.Server.PAZServiceWCF.Business_PrepareDataSet(String userName, String module, String code, DataSet& dataSet) in d:\PAZ_TestClient_WCF\src\PAZ.Client.ServerWCF\PAZServiceWCF.cs:Zeile 394. bei PAZ.Client.Server.Database.Database.CreateTables(String schema, String table, IDataSet dataSet, DataTable& dataTable, IMessageTable& messageTable) in d:\PAZ_TestClient_WCF\src\PAZ.Client.Server\Database\Database.cs:Zeile 272. bei PAZ.Framework.Database.BaseDataSet.OnCreateTable(IDataSet dataSet, String schema, String table, String[] roles) in d:\PAZ_TestClient_WCF\src\PAZ.Framework\Database\BaseDataSet.cs:Zeile 1758. bei PAZ.Framework.Database.BaseDataSet.CreateTable(String schema, String table, DataTable& dataTable, String[] roles) in d:\PAZ_TestClient_WCF\src\PAZ.Framework\Database\BaseDataSet.cs:Zeile 476. bei PAZ.Framework.Database.BaseDataSet.CreateTable(String schema, String table, String[] roles) in d:\PAZ_TestClient_WCF\src\PAZ.Framework\Database\BaseDataSet.cs:Zeile 432. bei PAZ.Transaction.BaseMasterTransaction.InitializeDataSet(StartEventArgs e) in d:\PAZ_TestClient_WCF\src\PAZ.Transaction\BaseMasterTransaction.cs:Zeile 721. bei PAZ.Transaction.BaseTransaction.OnStart(StartEventArgs e) in d:\PAZ_TestClient_WCF\src\PAZ.Transaction\BaseTransaction.cs:Zeile 2093. bei PAZ.Transaction.BaseTransaction.DoStart(Object sender, StartEventArgs e) in d:\PAZ_TestClient_WCF\src\PAZ.Transaction\BaseTransaction.cs:Zeile 1361. bei PAZ.Framework.Transaction.TransactionManager.DoStartTransaction(String code, IParameterTable parameter, Boolean performSearch) in d:\PAZ_TestClient_WCF\src\PAZ.Framework\Transaction\TransactionManager.cs:Zeile 567. InnerException: System.Net.WebException HResult=-2146233079 Message=Die zugrunde liegende Verbindung wurde geschlossen: Eine Verbindung, deren Aufrechterhaltung erwartet wurde, ist vom Server geschlossen worden.. Source=System StackTrace: bei System.Net.HttpWebRequest.GetResponse() bei System.ServiceModel.Channels.HttpChannelFactory1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
InnerException: System.IO.IOException
HResult=-2146232800
Message=Von der Übertragungsverbindung können keine Daten gelesen werden: Eine vorhandene Verbindung wurde vom Remotehost geschlossen.
Source=System
StackTrace:
bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
bei System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
bei System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
InnerException: System.Net.Sockets.SocketException
HResult=-2147467259
Message=Eine vorhandene Verbindung wurde vom Remotehost geschlossen
Source=System
ErrorCode=10054
NativeErrorCode=10054
StackTrace:
bei System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
bei System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
InnerException:

Web.config:

  <!--====================================================================================================================-->
  <!--|                                Nachfolgend folgen alle WCF Service Konfigurationen  ! ! !                        |-->
  <!--====================================================================================================================-->

  <system.web>
      <compilation debug="true"
				           targetFramework="4.5.1"/>
      <httpRuntime targetFramework="4.5"
                   maxRequestLength="32000"
                   executionTimeout="7200"
                   />
  </system.web>


  <!--Debuglogging-->
  <system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                      type="System.Diagnostics.XmlWriterTraceListener"
                      initializeData="c:\messages.svclog" />
          </listeners>
      </source>
    </sources>
</system.diagnostics>
  
  

  <system.serviceModel>
        
        <!--Debuglogging-->
        <diagnostics>
          <messageLogging logEntireMessage="true"
                          logMessagesAtServiceLevel="true"
                          maxMessagesToLog="3000"
                          maxSizeOfMessageToLog="2000"
                          logMalformedMessages="true"                        
                          logMessagesAtTransportLevel="true"
                          />
        </diagnostics>
    
    
        <behaviors>
            <endpointBehaviors>
                <behavior>
                  <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
                </behavior>
            </endpointBehaviors>

            <serviceBehaviors>
                <behavior>
                  <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
                  <!-- Legen Sie die Werte unten vor der Bereitstellung auf "false" fest, 
                          um die Veröffentlichung von Metadateninformationen zu vermeiden. -->
                  <serviceMetadata httpGetEnabled="true"
                                   httpsGetEnabled="true"/>
                  <!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, 
                         legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, 
                         um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
                  <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>             
            </serviceBehaviors>   
        </behaviors>

    
        <services>
            <service name="PAZ.ApplicationServer.ServiceLayerWCF.PAZService">
                <clear />
                <endpoint binding="basicHttpBinding"   
                          contract="PAZ.ApplicationServer.ServiceLayerWCF.IPAZService" 
                          name="defaultEndpoint" />
            </service>
        </services>

    
        <bindings>
            <basicHttpBinding>
              <binding closeTimeout="00:20:00"
                       openTimeout="00:20:00"
                       sendTimeout="00:20:00"
                       receiveTimeout="00:10:00"
                       maxBufferSize="30720000"
                       maxBufferPoolSize="30720000"
                       maxReceivedMessageSize="30720000"
                       bypassProxyOnLocal="false"
                       allowCookies="false"
                       textEncoding="utf-16"
                       messageEncoding="Text"
                       transferMode="Buffered"
                       useDefaultWebProxy="true"
                       hostNameComparisonMode="StrongWildcard"                       
                       >

                <readerQuotas maxDepth="128"
                              maxStringContentLength="30720000"
                              maxArrayLength="30720000"
                              maxBytesPerRead="30720000"
                              maxNameTableCharCount="30720000" />
                
                <security mode="None" >
                    <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>

              </binding>
            </basicHttpBinding>   
        </bindings>
    
      <protocolMapping>
          <add binding="basicHttpsBinding" 
                scheme="https"/>
          <!--<add binding="basicHttpsBinding" 
                scheme="http"/>-->
      </protocolMapping>
      
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                                   multipleSiteBindingsEnabled="true"/>

  </system.serviceModel>
  
  
  <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <!--
            Um das Stammverzeichnis der Webanwendung beim Debuggen auszuwählen, 
            legen Sie den Wert unten auf "true" fest.
            Legen Sie ihn vor der Bereitstellung auf "false" fest, 
            um die Veröffentlichung von Informationen über den Webanwendungsordner zu vermeiden.
          -->
        <directoryBrowse enabled="true"/>
  </system.webServer>

app.config

  <!--====================================================================================================================-->
  <!--|                                Nachfolgend folgen alle WCF Service Konfigurationen  ! ! !                        |-->
  <!--====================================================================================================================-->

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
  </startup>

  <system.web>
    <compilation debug="true"
                 targetFramework="4.5.1"/>
    <httpRuntime targetFramework="4.5"
                 maxRequestLength="32000"
                 executionTimeout="7200"
                   />
  </system.web>

  <system.serviceModel>
      <bindings>
          <basicHttpBinding>
          
              <binding closeTimeout="00:20:00"
                       openTimeout="00:20:00"
                       sendTimeout="00:20:00"
                       receiveTimeout="00:10:00"
                       maxBufferSize="30720000"
                       maxBufferPoolSize="30720000"
                       maxReceivedMessageSize="30720000"
                       bypassProxyOnLocal="false"
                       allowCookies="false"
                       textEncoding="utf-16"
                       messageEncoding="Text"
                       transferMode="Buffered"
                       useDefaultWebProxy="true"
                       hostNameComparisonMode="StrongWildcard"
                       >

                      <readerQuotas maxDepth="128"
                                    maxStringContentLength="30720000"
                                    maxArrayLength="30720000"
                                    maxBytesPerRead="30720000"
                                    maxNameTableCharCount="30720000" />
                
                <security mode="None" >
                    <transport clientCredentialType="None" 
                               proxyCredentialType="None" 
                               realm="" />
                  
                    <message clientCredentialType="UserName" 
                             algorithmSuite="Default" />
                </security>  
                
              </binding>
            
        </basicHttpBinding>
      </bindings>

    <client>
        <endpoint address="http://localhost/PAZServiceWCF/PAZService.svc"
                  binding="basicHttpBinding"
                  contract="PAZServiceWCFRef.IPAZService" />
      
        
    </client>

  </system.serviceModel>

Habe ich etwas übersehen? Müsste das nicht eigentlich gehen?

16.842 Beiträge seit 2008
vor 10 Jahren

Du willst nicht im ernst DataSets mit WCF übertragen?
Lass blos die Finger davon; DataSets sind kein geeignetes DTO und haben daher in dieser Kommunikation nichts zu suchen.

Returning DataSets from WebServices is the Spawn of Satan and Represents All That Is Truly Evil in the World

Der Beitrag ist zwar bald ++10 Jahre alt ++aber immer noch wahr.

H
henk Themenstarter:in
15 Beiträge seit 2009
vor 10 Jahren

Meine Idee ist das nicht. Doch als WebServices läuft es und wenn es nach mir ginge, wäre die Dinger auch Tabu. Nur leider kann ich mir das nicht ausssuchen. Ich denke aber darüber nach, daraus dynamische Array zu machen um auf der Clientseite wieder DataSets zu erzeugem, die sich durch das gesammte Projekt ziehen. Leider. Würdet ihr das auch so machen?

DataSets sind für das Projekt Elementar und aktuelle nicht ersetzbar.

16.842 Beiträge seit 2008
vor 10 Jahren

Dann fürchte ich muss ich Dir sagen, dass WCF nichts für Dich ist - da wäre Remoting wohl besser gewesen; sowas hättet ihr in der Evaluierungsphase prüfen müssen. Da hat der Planer wohl ein Bock geschossen.
DataSet über WCF ist ein No-Go und wird (Gott sei Dank!) auch nicht völlig unterstützt.

Bei WCF kommuniziert man mit DTOs; bei allen anderen Dingen sind Folgeprobleme vorprogrammiert.

849 Beiträge seit 2006
vor 10 Jahren

Hi, wir haben so einen Quatsch auch mal gemacht.. Ist inzwischen aus guten Gründen abgelöst.. aber hat funktioniert. Allerdings haben wir das DS erst in ein XML gewandelt, dann gezippt und dann mit WCF über die Leitung geschickt. (DS bietet zum wandeln in XML netter weise schon Methoden an..)

Nicht schön, aber wenns nicht anders geht.. Ich hatte damit glücklicher Weise nichts zu tun 😉

H
henk Themenstarter:in
15 Beiträge seit 2009
vor 10 Jahren

Ich glaube nicht, dass man den erschaffern einen großen Vorwurf machen kann. Als das Projekt entwickelt wurde dachte noch niemand an WCF. C# lag zur derzeit in der Version 1.0 oder so ähnlich vor.

Die WCF Schnittstelle soll später genutzt werden, um von anderen Plattformen darauf zugreifen zu können. Darum denke ich an eine DataSet-Umwandlung als Array nach. Ich möchte dabei Datentypeb nutzen, die von den gängisten Spachen wie JAVA verstanden werden.

Beste Grüße

106 Beiträge seit 2011
vor 10 Jahren

Hier der reparierte Link von Abt:

http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx

Der Link lässt sich leider nicht in die URL-Tags packen, da das Forum immer ein "<br />" mit reinsetzt.