2010-05-19 3 views
2

У меня проблема с сервисом WCF, который я только что создал. Это работало вчера, но по какой-то причине оно просто перестало работать.CommunicationException в 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; 
     } 
    } 

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

С уважением, Mark

ответ

0

Возможно, у вас возникли проблемы с подключением. Я имею в виду, что у вас нет доступа к ресурсу, к которому вы пытаетесь получить доступ. Есть ли какой-либо брандмауэр или что-то еще Обязательно попробуйте telnet-сервер с клиентской машины.

+0

Нет, я не верну больше результатов. Фактически при тестировании я возвращаю меньше всего - всего 5 сущностей. Другое дело, что объект Branch имеет намного больше зависимостей - внешние ключи и так далее. Может ли WCF с этим справиться? – serlingpa

+0

Я не сказал, что он может быть связан с размером результата. Это может быть проблема с подключением. Пожалуйста, прочитайте выше. – Incognito

+0

Я добавил диагностический материал, как вы предлагаете marc_s, и я прочитал журналы, которые были созданы, но я не мудрее. Я вижу, где исключение действительно бросается, но я не понимаю, почему! Aargh !! – serlingpa

1

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

Я хотел бы сделать две вещи:

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:

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

Смежные вопросы