Error al usar el método Linq "Incluir" con Entity framework 4.1, ¿Error?

Estoy usando SQL Azure como base de datos con la primera técnica de código de Entity Framework 4.1. Estoy accediendo a EF desde WCF como nivel medio y proporciono la referencia de servicio a ASP.NET MVC 3.

El escenario relacional en EF es A->B->C así que, como de costumbre, traté de obtener A, incluido B, incluido C, con pocas posibilidades:

db.A.Include("B").Include("B.C")
db.A.Include("B").Include("C")

Pero en el propio Servicio funciona perfectamente. Desde que agregó la referencia a la aplicación web, intenta serializar y lanza la excepción a continuación. Traté de hacer una carga diferida verdadero-falso también sin éxito.

"The underlying connection was closed: The connection was closed unexpectedly"
Stack Trace found:
 at System.Net.HttpWebRequest.GetResponse() at
 System.ServiceModel.Channels.HttpChannelFactory.
     HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

visité consulta en esta página para resolver y agregar los atributos sugeridos en web.config. Ahora de repente recibo un error:

El servidor no proporcionó una respuesta significativa; esto puede deberse a una discrepancia en el contrato, un cierre prematuro de la sesión o un error interno del servidor

Pensé que podría deberse a una discrepancia de etiqueta / atributo en el cliente y el servicio web.configs, pero todo está ahí. Una cosa que no pude conseguir al pasar la Lista de objetos con la carga de todas sus propiedades de selección, desde el servicio wcf hasta la aplicación web, es muy pesada y de bajo rendimiento. todavía enfrenta los problemas anteriores para obtener la lista cargada en la aplicación web en la arquitectura explicada anteriormente. ¿Puede algún cuerpo ayudar aquí ...?

preguntado el 08 de noviembre de 11 a las 18:11

¿Qué hay de mostrar el mensaje de error? -

hola gracias ... He editado mi pregunta con mensajes de error. -

2 Respuestas

hola gracias Kirk Broadhurst, con esto pude rastrear el problema. y buscar a su alrededor. Tengo la solucion. Agregué esta clase en mi proyecto

public class ReferencePreservingDataContractFormatAttribute : Attribute, IOperationBehavior
        {
            #region IOperationBehavior Members
            public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
            {
            }

            public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy)
            {
                IOperationBehavior innerBehavior = new ReferencePreservingDataContractSerializerOperationBehavior(description);
                innerBehavior.ApplyClientBehavior(description, proxy);
            }

            public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch)
            {
                IOperationBehavior innerBehavior = new ReferencePreservingDataContractSerializerOperationBehavior(description);
                innerBehavior.ApplyDispatchBehavior(description, dispatch);
            }


            public void Validate(OperationDescription description)
            {
            }
            #endregion
        }

        class ReferencePreservingDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
        {
            public ReferencePreservingDataContractSerializerOperationBehavior(OperationDescription operationDescription) : base(operationDescription) { }
            public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
            {
                return CreateDataContractSerializer(type, name, ns, knownTypes);
            }

            private static XmlObjectSerializer CreateDataContractSerializer(Type type, string name, string ns, IList<Type> knownTypes)
            {
                return CreateDataContractSerializer(type, name, ns, knownTypes);
            }

            public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
            {
                return new DataContractSerializer(type, name, ns, knownTypes,
                0x7FFF /*maxItemsInObjectGraph*/,
                true/*ignoreExtensionDataObject*/,
                true/*preserveObjectReferences*/,
                null/*dataContractSurrogate*/);
            }
        }
    }

Y agregó solo: [ReferencePreservingDataContractFormat] como un atributo con la definición del método donde quería usar el "Incluir". eso funcionó para mí. Esto podría ser útil para otras personas necesitadas.

respondido 15 nov., 11:07

el valor 0x7FFF = 32767 (maxItemsInObjectGraph) anulará cualquier configuración en app.config y / o web.config, entonces tenga cuidado. - antonio

Esta es una excepción de WCF muy común y puede ser cualquier número de cosas. Hay cientos de resultados en StackOverflow para este problema.

https://stackoverflow.com/search?q=%22The+underlying+connection+was+closed%22

¿Eres nuevo en WCF? ¿Funcionan algunas llamadas de servicio? Podría ser algo tan simple como excedido maxMessageSize.

Le sugiero que implemente el inicio de sesión en su servicio: agregue algunas etiquetas de diagnóstico a su archivo de configuración.

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData="c:\log\Traces.svclog"  />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.