CommunicationException в WCF - PullRequest
       1

CommunicationException в WCF

2 голосов
/ 19 мая 2010

У меня проблема с только что созданной службой WCF. Это работало вчера, но по какой-то причине просто перестало работать.

Один из моих методов WCF возвращает массив сущности Entity Framework, например:

    public BranchContactDetail[] GetClosestBranches(string postcode, int howManyBranches)
    {
        GeoLocation geoLocation = GetLocationFromPostcode(postcode);
        Location location = new Location(geoLocation.Latitude, geoLocation.Longitude);

        using (BranchDirectoryEntities entities = new BranchDirectoryEntities())
        {
            var branchesInOrder = entities.BranchContactDetails
                .Where(b => b.latitude.HasValue && b.longitude.HasValue )
                .OrderBy(b => location.DistanceFrom(b.latitude, b.longitude))
                .Take(howManyBranches)
                .ToArray();

            return branchesInOrder;
        }
    }

... и, как я уже сказал, вчера все работало нормально. Теперь я получаю «Основное соединение было закрыто: соединение было неожиданно закрыто». Я охотился по всей сети, но никто, кажется, не знает ответа. Кто-нибудь пролил свет на этот вопрос?

С уважением, Марк

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Может быть, вы выбираете намного больше записей сегодня, чем вчера? Может ли быть так, что ваш метод обслуживания занимает больше времени, чем по умолчанию 60 секунд, чтобы вернуть данные? Или может быть, что размер данных выходит за пределы 64 КБ для возвращаемых объектов?

Я бы сделал две вещи:

1) Включите сведения об исключении, чтобы вы могли получить подробное сообщение об исключении на клиенте - которое, мы надеемся, должно указывать вам правильное направление

2) Включите ведение журнала сообщений WCF, чтобы увидеть, что происходит по сети

Для пункта 1 необходимо включить поведение serviceDebug:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debug">
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="debug" name="YourWCFService">

Это должно дать вам детали в клиенте, когда вызов не удается.

Для пункта №. 2, вам нужно сделать несколько шагов:

Внутри <system.serviceModel>, вам нужно добавить этот диагностический тег:

<diagnostics>
  <messageLogging
      logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true"
      logEntireMessage="true" logMalformedMessages="true"
      maxMessagesToLog="2500" maxSizeOfMessageToLog="256000" />
</diagnostics>

и затем вам также нужно добавить это в ваш app.config или web.config:

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
        <listeners>
          <add name="default"
               type="System.Diagnostics.XmlWriterTraceListener"
               initializeData="C:\yourlogfile.svclog" />
        </listeners>
      </source>
    </sources>
    <trace autoflush="true" />
  </system.diagnostics>

В пространстве имен System.Diagnostics есть пара предопределенных типов прослушивателей трассировки - используйте любой из этих готовых или создайте свой собственный (например, для входа в базу данных или тому подобное).

Ознакомьтесь с этими дополнительными источниками информации о том, как включить трассировку в WCF:

Вы можете просматривать эти файлы svclog на основе XML с помощью WCF Trace Viewer Tool - очень удобно!

0 голосов
/ 19 мая 2010

Скорее всего, у вас проблема с подключением. Я имею в виду, что у вас нет доступа к ресурсу, к которому вы пытаетесь получить доступ. Есть ли брандмауэр или что-то еще. Чтобы быть уверенным, попробуйте telnet сервер с клиентского компьютера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...