Основное соединение было закрыто: соединение было неожиданно закрыто - PullRequest
16 голосов
/ 12 ноября 2008

Это исключение постоянно генерируется в запросе SOAP, получение которого занимает почти три минуты, а его размер составляет 2,25 мегабайта.

При поиске в Интернете я нахожу всевозможные посты, которые, похоже, касаются установки заголовков в Запросе, некоторые хотят, чтобы я не отправлял заголовок «Expect:», некоторые хотят, чтобы я отправлял «Keep-Alive:» заголовок, но независимо от заголовков, которые я посылаю, я все еще получаю эту досадную ошибку. Я не верю, что установка каких-либо заголовков является моим ответом, потому что Я могу воссоздать точно такой же запрос, используя "curl", и ответ в конечном итоге возвращается без проблем, что вообще когда-либо .

Мой <httpRuntime maxRequestLength="409600" executionTimeout="900"/>.

Мне кажется, что у меня заканчиваются варианты. Если кто-то может оказать какую-либо помощь, я был бы очень признателен. Следует также отметить, что сервер, с которого я запрашиваю данные, не в моих руках, также эти запросы выполняются по протоколу https, а другие запросы с меньшими ответами работают без сбоев.

Спасибо

Ответы [ 10 ]

11 голосов
/ 13 ноября 2008

Вы отметили пост как .NET35, так что вы используете WCF?

Если это так, вот пример файла App.config, который мы используем для больших наборов данных:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="8388608" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:1602/EndPoint.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="IEndPointContract" name="EndPoint" behaviorConfiguration="EndpointBehaviour" />     
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="EndpointBehaviour">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
6 голосов
/ 17 июня 2009

Надеюсь, еще не поздно ответить на этот вопрос.

Попробуйте добавить следующий атрибут в определение интерфейса вашего контракта:

[ServiceKnownType(typeof(ReturnClass))]

Для более общего решения, которое позволяет возвращать полиморфные классы, пожалуйста, обратитесь к этому сообщению: http://www.goeleven.com/blog/entryDetail.aspx?entry=45

4 голосов
/ 19 ноября 2011

Если вы используете dbml вместо edmx, вы получите это (базовое соединение было закрыто: соединение было закрыто неожиданно.), Поскольку dbml не будет возвращать сериализуемые данные, для которых требуется datacontract, поэтому перейдите в свойства файла dbml и измените сериализацию режим однонаправленный.

3 голосов
/ 26 июня 2013

Пробовал несколько способов избавиться от этого сообщения об ошибке, пока не нашел это решение: http://kiranpatils.wordpress.com/2008/09/22/the-underlying-connection-was-closed-the-connection-was-closed-unexpectedly-while-returning-data-table-from-wcf-service/

Вы можете изменить свой Список <> на DataSet. Я подозреваю, что DataSet может обрабатывать много данных, чем List <>.

Надеюсь, это поможет.

3 голосов
/ 14 января 2012

Я получил эту ошибку, потому что мои объекты данных рекурсивно ссылались друг на друга.

Например:

Клиент-> (имеет) -> Рейтинг Рейтинг-> (принадлежит) -> Заказчик

так что вы должны удалить циклы.

[DataContract]
public class Rating
{
    private Customer _customer;
    //[DataMember] // <-  EITHER HERE 
    public Customer Customer
    {
        get { return _customer; }
        set { _customer = value; }
    }
}


[DataContract]
public class Customer
{
    private long _customerID;
    [DataMember]
    public long CustomerID
    {
        get { return _customerID; }
        set { _customerID = value; }
    }

    [DataMember] // <- OR HERE
    public Rating Rating
    {
        get { return _rating; }
        set { _rating = value; }
    }
}
3 голосов
/ 02 августа 2010

У меня та же проблема, и после глубоких исследований я нашел эту статью:

Блог Меррика Чеффера

Все это было связано с установкой dataContractSerializer для клиента и сервера. Надеюсь, что это будет полезно.

3 голосов
/ 13 ноября 2008

Вы пробовали использовать это сообщение в блоге ? Скорее всего, проблема заключается в реализации стека TCP / HTTP .NET.

2 голосов
/ 20 сентября 2011

Я добавил еще одно поле, но у него не было набора для свойства. Это было мое решение для той же ошибки.

[DataMember]
public bool HasValue
{
    get { return true; }
    set { }//adding this line made the solution.
}
1 голос
/ 15 июля 2014

Это общая ошибка, возникающая при внутренней ошибке.

Попробуйте добавить трассировку здесь: http://msdn.microsoft.com/en-us/library/ms732023(v=vs.110).aspx

Тогда вы увидите полный журнал.

0 голосов
/ 27 ноября 2013

Для WCF с EF просто добавьте следующий код в класс контекста.

base.Configuration.ProxyCreationEnabled = false;

...