Тайм-аут обратного вызова WCF и катастрофический сбой Visual Studio - PullRequest
2 голосов
/ 29 января 2011

Некоторая глупая ошибка, но это произошло, когда я хотел вызвать клиент с помощью службы на стороне сервера (дуплекс WCF):

Сообщение не может быть передано в течение выделенного времени ожидания обратного вызова wcf00:01:00, в окне передачи надежного канала не было места

Также что-то mysterious happened too.В методе входа в систему, когда я вызывал службу, если имя пользователя и пароль были неправильными, я нахожу функцию обратного вызова отправителя, а затем вызываю метод GetError для отправителя, чтобы показать логическую ошибку, такую ​​как «Пользователь неправ».Это работает хорошо, но если пользователь и пароль верны и имеют доступ, я получил эту ошибку (то же самое для всех других методов на стороне клиента - во всех этих методах я отправляю больше данных, чем простые строки, я был отправлен geterror)!

Редактировать 2: Как я уже говорил в большинстве методов обратного вызова, я отправлял данные, такие как data-context (LINQ to SQL) data-class (список или одна строка).Так что это может быть моей проблемой или нет!
(Но это не первый раз, когда я использую WCF-дуплекс, также с отправкой структуры данных в методах обратного вызова, я так поражаюсь.)

Также после этой ошибки я получил эту ошибку,

Экран не смог обработать запрос от службы http://server:15450/service.svc катастрофический сбой

Редактировать 3: Конфигурация службы:

 <system.serviceModel>
    <services>
      <service name="ContactServer.Business.ContactService"
               behaviorConfiguration="ServiceBehavior">
        <endpoint address=""
                  binding="wsDualHttpBinding"
                  contract="ContactServer.Business.IContactService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"
                  name="MexBinding"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

и Конфигурация клиента

  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_ContactService" 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">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:1408/ContactService.svc"
        binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_ContactService"
        contract="ServiceReference.ContactService" name="WSDualHttpBinding_ContactService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

Дополнительная информация: Я использую .NET 3.5 и Visual Studio 2010Также после увеличения тайм-аута на стороне клиента я все еще получил ту же ошибку, with 00:01:00 Time.Почему это произошло?

1 Ответ

2 голосов
/ 02 февраля 2011

Проблема касается переноса сущностей из WCF-сервиса.

Например, у нас есть эта модель базы данных: enter image description here

Entity Framework:

    public Item GetItem(int id)
    {
        var se = new SampleEntities();
        return se.Items.FirstOrDefault(i => i.Id == id);
    }

Код не кажется неправильным, но в действительности он вернет элемент со всеми связанными элементами.

        var s = new SampleServiceClient();
        var item = s.GetItem(1);
        Assert.AreEqual(item.RelatedItems.Any(), true); //equal

Это особенно опасно, если у нас много-Множество отношений в базе данных.Поэтому отложенная загрузка должна быть отключена (их можно отключить непосредственно перед возвратом):

var se = new SampleEntities();
se.ContextOptions.LazyLoadingEnabled = false;
return se.Items.FirstOrDefault(i => i.Id == id);

Linq to SQL

    public Item GetItem(int id)
    {
        var dc = new DataClasses1DataContext();
        return dc.Items.FirstOrDefault(i => i.Id == id);
    }

У нас есть исключение:

Произошла ошибка при попытке сериализации параметра: GetItemResult.Сообщение InnerException было «Граф объекта для типа« WebApplication1.RelatedItem »содержит циклы и не может быть сериализовано, если отслеживание ссылок отключено. '.

Необходимо открыть диаграмму DataContext и установить Properties-> SerializationMode->Unindirectional. Здесь - более полное объяснение.

...