Ошибка при использовании метода Linq «Включить» с Entity Framework 4.1, ошибка? - PullRequest
0 голосов
/ 08 ноября 2011

Я использую SQL Azure в качестве базы данных с использованием техники кода в Entity Framework 4.1. Я обращаюсь к EF из WCF в качестве среднего уровня и предоставляю сервисную ссылку на ASP.NET MVC 3.

Реляционный сценарий в EF - A->B->C, поэтому, как обычно, я попытался получить A, включая B, включая C, с небольшими возможностями:

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

Но в самой Службе работает отлично. После добавления ссылки на веб-приложение оно пытается сериализоваться и выдает исключение ниже. Я пытался сделать истинно-ложную ленивую загрузку также безуспешно.

"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)

Я посетил эту страницу для разрешения и добавил предложенные атрибуты в web.config. Теперь я вдруг получаю сообщение об ошибке:

Сервер не предоставил значимого ответа; это может быть вызвано несоответствие контракта, преждевременное завершение сеанса или внутренний ошибка сервера

Я подумал, что это может быть связано с некоторым несоответствием тега / атрибута в клиенте и сервисе web.configs, но все тут же. Одна вещь, которую я не мог получить при передаче списка объектов с загрузкой всех его свойств cllection, от службы wcf к веб-приложению, оказалась очень тяжелой и низкой по производительности. все еще сталкиваюсь с вышеупомянутыми проблемами, чтобы получить загруженный список в веб-приложении в вышеописанной архитектуре. Может ли какое-то тело помочь здесь ...

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

эй, спасибо Кирк Бродхерст По этому я мог отследить проблему. и искать вокруг него. Я получил решение. Я добавил этот класс в свой проект

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*/);
            }
        }
    }

И добавил просто: [ReferencePreservingDataContractFormat] как атрибут с определением метода, где я хотел использовать «Включить». вот это сработало для меня. Это может быть полезно для других нуждающихся людей.

0 голосов
/ 10 ноября 2011

Это очень распространенное исключение WCF и может быть любым. В StackOverflow есть сотни обращений для этой проблемы.

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

Вы новичок в WCF? Работают ли какие-либо сервисные звонки? Это может быть что-то столь же простое, как превышение maxMessageSize.

Я бы посоветовал вам включить регистрацию в вашей службе - добавьте некоторые диагностические теги в файл конфигурации.

  <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>
...