Laden...

WCF, EF4, POCO kann keine Relationen laden

Erstellt von ZeroQool vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.239 Views
Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 12 Jahren
WCF, EF4, POCO kann keine Relationen laden

verwendetes Datenbanksystem: SQL Server 2008
VS2010, Win7, x64, .NET 4, IIS 7.5

Hallo zusammen,

komme im Moment nicht weiter und habe Google soweit durch, deshalb ist das hier meine letzte Anlaufstelle.

Zur Zeit habe ich in meiner Projektmappe folgende Projekte:

  • PocoTemplate (FsvModel.edmx, FsvModel.Context.tt)
  • PocoTemplateEntities (FsvModel.tt)
  • PocoWcfService (IService1.cs, Service1.svc)
  • PocoWcfServiceConsoleClient (Program.cs)

Das POCO habe ich mit der VS Extension erstellt.
Sämtliche Projekte laufen unter .NET 4.0 und der WCF unter dem IIS 7.5.


    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        Person GetData();
    }


 public class Service1 : IService1
    {
        public Person GetData()
        {
            using (var context = new FsvContainer())
            {
                context.ContextOptions.LazyLoadingEnabled = false;
                context.ContextOptions.ProxyCreationEnabled = false;

                try
                {
                    var people = context.People.Include("Person_Bank");


                    var query = context.People.Include("Person_Bank").FirstOrDefault();
                    //var query = context.People.AsEnumerable().FirstOrDefault();

                    return query;
                }
                catch (Exception exception)
                {
                    throw;
                }
            }
        }


<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="FsvContainer" connectionString="metadata=res://*/FsvModel.csdl|res://*/FsvModel.ssdl|res://*/FsvModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=FSV;Persist Security Info=True;User ID=XXX;Password=XXX;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "d:\logs\wcf6.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
  <system.serviceModel>
    <services>
      <!-- Hinweis: Der Dienstname muss dem Konfigurationsnamen für die Dienstimplementierung entsprechen. -->
      <service name="PocoWcfService.Service1" behaviorConfiguration="MyServiceTypeBehaviors" >
        <endpoint address="" binding="wsHttpBinding" contract="PocoWcfService.IService1" bindingConfiguration="wsHttpBindingNoSCT">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBindingNoSCT">
          <security mode="None">
            <transport clientCredentialType="None"/>
            <message establishSecurityContext="false"/>
          </security>
        </binding>
        <binding name="AnonymousBinding">
          <security mode="None">
            <transport clientCredentialType="None" />
            <message clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
          <!-- Legen Sie den Wert unten auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden, und entfernen Sie den Metadatenendpunkt oben vor der Bereitstellung. -->
          <serviceMetadata httpGetEnabled="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>
  </system.serviceModel>

</configuration>

Ich bekomme es nicht die 1:n Beziehungen zu dem Objekt Person zu laden zB "Person_Bank" usw. Ich bekomme jedes mal eine Exception. Wenn ich ohne den "include" arbeite kann ich den Service fehlerfrei aufrufen, aber bekomme natürlich nur das Objekt Person, ohne "Person_Bank" usw.

Diese Meldung bekomme ich, wenn ich über eine Console den Service aufrufe:> Fehlermeldung:

Fehler beim Empfangen der HTTP-Antwort für
>
. Die Ursache kann sein, dass die Dienstendpunktbindung kein HTTP-Protokoll verwendet. Eine andere mögliche Ursache ist, dass der HTTP-Anforderungskontext vom Server abgebrochen wird (vermutlich auf das Herunterfahren des Diensts zurückzuführen). Weitere Informationen finden Sie in den Serverprotokollen.

 static void Main(string[] args)
        {
            Service1Client  service1Client = new Service1Client();
            var person = service1Client.GetData();

        }

generierte app.config


<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1" 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" allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                    <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
                    <security mode="None">
                        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"/>
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/PocoWcfService/Service1.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" contract="PocoServiceReference.IService1" name="WSHttpBinding_IService1">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>


WCF Log:> Fehlermeldung:

<Exception>
<ExceptionType>System.ServiceModel.FaultException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>Die Nachricht mit Action "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get" kann aufgrund einer fehlenden ContractFilter-Übereinstimmung beim EndpointDispatcher nicht verarbeitet werden. Mögliche Ursachen: Vertragskonflikt (keine Action-Übereinstimmung zwischen Sender und Empfänger) oder ein Bindung/Sicherheit-Konflikt zwischen dem Sender und dem Empfänger. Stellen Sie sicher, dass Sender und Empfänger über den gleichen Vertrag und die gleiche Bindung verfügen (einschließlich Sicherheitsanforderungen, z. B. "Message", "Transport", "None").</Message>
<StackTrace>
bei System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch(Exception e, Message message)
bei System.ServiceModel.Dispatcher.ChannelHandler.ReplyFailure(RequestContext request, Message fault, String action, String reason, FaultCode code)
bei System.ServiceModel.Dispatcher.ChannelHandler.ReplyContractFilterDidNotMatch(RequestContext request)
bei System.ServiceModel.Dispatcher.ChannelHandler.EnsureChannelAndEndpoint(RequestContext request)
bei System.ServiceModel.Dispatcher.ChannelHandler.TryRetrievingInstanceContext(RequestContext request)
bei System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
bei System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
bei System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result)
bei System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
bei System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
bei System.Runtime.InputQueue1.AsyncQueueReader.Set(Item item) bei System.Runtime.InputQueue1.EnqueueAndDispatch(Item item, Boolean canDispatchOnThisThread)
bei System.Runtime.InputQueue1.EnqueueAndDispatch(T item, Action dequeuedCallback, Boolean canDispatchOnThisThread) bei System.ServiceModel.Channels.SingletonChannelAcceptor3.Enqueue(QueueItemType item, Action dequeuedCallback, Boolean canDispatchOnThisThread)
bei System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived(HttpRequestContext context, Action callback)
bei System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result)
bei System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()
bei System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()
bei System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state)
bei System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
bei System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
bei System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
</StackTrace>
<ExceptionString>System.ServiceModel.FaultException: Die Nachricht mit Action "http://schemas.xmlsoap.org/ws/2004/09/transfer/Get" kann aufgrund einer fehlenden ContractFilter-Übereinstimmung beim EndpointDispatcher nicht verarbeitet werden. Mögliche Ursachen: Vertragskonflikt (keine Action-Übereinstimmung zwischen Sender und Empfänger) oder ein Bindung/Sicherheit-Konflikt zwischen dem Sender und dem Empfänger. Stellen Sie sicher, dass Sender und Empfänger über den gleichen Vertrag und die gleiche Bindung verfügen (einschließlich Sicherheitsanforderungen, z. B. "Message", "Transport", "None").</ExceptionString>
</Exception>

Hatte auch zwischendurch mal andere Fehlermeldungen gehabt, da ich durch ein paar Google Einträge darauf gestoßen bin in meinem T4 Template mit


[DataContract]
[DataContract(IsReference=true)]
[DataMember]

zu arbeiten, aber hat auch nciht funktioniert. Es kamen wieder andere Fehlermeldungen. Dann habe ich es auch mit "ApplyDataContractResolverAttribute" versucht oder "CyclicReferencesAwareContractBehavior"

Ich denke der Fehler muss irgendwo bei der Serialisierung liegen, aber weiß im Moment nicht mehr weiter.

Wäre für jeden weiteren Tip sehr dankbar!

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo ZeroQool,

so wie ich das sehe passt die generierte WCF-Client-Konfig. nicht zu jener des Service. Das schreibt auch die Fehlermeldung.
In der Service-Konfig sind 2 Bindungen definiert, in der Client-Konfig nur 1 die zu keiner der beiden vom Service passt. Hier musst du händisch nachbessern, od. gleich mit z.B. dem WCF Service Configuration Editor selbst erstellen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 12 Jahren

Hallo gfoidl,

danke für den Hinweis. Habe auch schon darüber nachgedacht, ob es daran liegen könnte, aber die Theorie habe ich verworfen, weil der gleiche Fehler auch beim integrierten "MS WCF-Testclient" auftritt.

Werde jetzt aber die Client Config mal mit dem "WCF Service Configuration" selbst erstellen.

Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 12 Jahren

Hallo gfoidl,

ich habe neue Erkenntnisse. Meinen Dienstverweis mache ich über "VS rechte Maustaste" im Projekt. Selbst mit dem Konfigurator hatte ich immer noch den gleichen Fehler.
Habe dann wieder rumgegoogelt und bin auf folgende Seite gestoßen How To: Create a Windows Communication Foundation client. Habe mir dann mit dem Befehl:

svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost/PocoWcfService/Service1.svc

die ProxyKlasse erstellt und die Files generatedProxy.cs und app.config in mein Client Projekt kopiert. Den alten Dienstverweis rausgehauen und siehe da ich habe meine List Person_Bank bekommen.

Jetzt ist die Frage warum das so ist... Habe auch im Anschluß den MS WCF-Testclient gestartet und bekam die Exception. Sieht im Moment wirklich so aus als würde es nur funktionieren, wenn ich mir eine Proxy-Klasse generiere.

Danke im Voraus!

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo ZeroQool,

die VS-Proxy-Generation bzw. die app.config ist halt fehlerhaft bzw. liefert eine app.config die nicht passt.. Die Ursach liegt darin dass das VS-Tool (das auch auf svcutil.exe zugreift) halt nicht weiß welche Bindung von den 2 agnegeben verwendet werden soll. Als Bug würde ich das trotzdem nicht unbedingt bezeichnen.

Jedenfalls ist man besser beraten den Proxy und die app.config selbst zu erstellen, denn da hat man die volle Kontrolle was passiert. Sofern möglich würde ich die Proxy-Klasse auch selbst schreiben. Diese setzt aber voraus, dass die ServiceContract-Assembly vorhanden sein muss.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"