2009-09-08 2 views
0

Все,WCF времени с перерывами

У меня есть службы WCF, что раз с перерывами, как правило, примерно через десять или двенадцать запросов от клиента ASP.NET. Служба использует отражение, чтобы найти классы в своей сборке (WAP-dll), которые имеют настраиваемый набор атрибутов. Сам процесс очень быстрый, обычно занимает всего несколько миллисекунд, и когда он работает, он отлично работает.

Установка точки останова в вызывающем коде и в самой службе сообщает мне, что тайм-аут происходит между вызовом из прокси-класса клиента WCF и когда этот метод фактически выполняется.

Идеи?

Update: связывание, и т.д. из web.config:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Sdd.Services.ControlPanelBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="Sdd.Services.ControlPanelBehavior" 
     name="Sdd.Services.ControlPanel"> 
     <endpoint address="" binding="wsHttpBinding" contract="Sdd.Services.IControlPanel"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 

UPDATE: А вот соответствующая часть из web.config клиента:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_IControlPanel" 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" allowCookies="false"> 
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
    <security mode="Message"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" 
     realm="" /> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" 
     algorithmSuite="Default" establishSecurityContext="true" /> 
    </security> 
    </binding> 
    </wsHttpBinding> 
    </bindings> 
    <client> 
    <endpoint address="http://localhost:81/services/ControlPanel.svc" 
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IControlPanel" 
    contract="PublicSite.IControlPanel" name="WSHttpBinding_IControlPanel"> 
    <identity> 
    <dns value="localhost" /> 
    </identity> 
    </endpoint> 
    </client> 
</system.serviceModel> 
+0

Есть ли у вас дополнительная информация? Какую конфигурацию вы используете (привязка, где находятся клиент и сервер, какие установлены разные таймауты). Что происходит, когда вы увеличиваете тайм-ауты? – olle

+0

Клиент и сервер находятся в моей dev-системе, работающей под управлением UltiDev Cassini. Когда это работает, время отклика составляет менее 50 мс. Это непротиворечиво, пока оно внезапно не перестанет работать, когда оно истечет через пару минут. Я не уверен, что такое привязка - я принял наивный подход к щелчку правой кнопкой мыши, добавлю ... WCF-сервис в VS2008. Если вы можете указать мне, где я могу найти эту информацию, я буду рад сообщить об этом. Благодаря! –

+0

Я знаю, что он атакует симптом, но, пожалуйста, проверьте, какие настройки тайм-аута привязки. Для пояснений см. Http://msdn.microsoft.com/en-us/library/ms731291.aspx. –

ответ

4

Огонь!

Это, вероятно, самая идиотская ошибка, но я понял, что проблема: поскольку я привык использовать веб-ссылки (веб-службу .asmx) вместо ссылок на службы (WCF), я пренебрег закроет прокси-сервер объект. Измененный

[WebMethod] 
    public static List<Page>PagesGetAll() 
    { 
     ControlPanelClient cp = new ControlPanelClient(); 
     Page[] pageArray = cp.NavigationPagesGetAll(); 
     List<Page> pageList = pageArray.ToList<Page>(); 

     // make sure that the page list in the database is up-to-date. 
     foreach(Page page in pageList) 
      Navigation.PageUpdate(page); 

     return pageList; 
    } 

в

public static List<Page>PagesGetAll() 
    { 
     List<Page> pageList = null; 

     using (ControlPanelClient cp = new ControlPanelClient()) 
     { 
      Page[] pageArray = cp.NavigationPagesGetAll(); 
      pageList = pageArray.ToList<Page>(); 
      // implied cp.Close() from "using" statement 
     } 

     // make sure that the page list in the database is up-to-date. 
     foreach(Page page in pageList) 
      Navigation.PageUpdate(page); 

     return pageList; 
    } 

И проблема исчезла. После проверки этого решения я также увеличил количество одновременных запросов, так как кажется логичным, что наличие более 10-12 одновременных запросов создало бы ту же проблему, что и раньше.

Спасибо всем!

+0

Lol, я добавил комментарий к вопросу выше о Abort/Close прокси-сервера, прежде чем я увидел ответ (неправильный порядок сортировки ответов): D –

2

Хороший способ, чтобы помочь диагностировать этот тип проблемы - включить трассировку на client and the server и использовать Service Trace View Tool. Это даст вам лучшее представление о том, где именно (в каком методе или вызове) проблема.

0

К сожалению, наиболее важные части конфигурации (привязки и конечные точки обслуживания) отсутствуют - и это также конфигурация клиента.

Но, как вы его описываете, 10-12 запросов, похоже, работают нормально, а затем есть сбой, может указывать на проблему с параллелизмом/дросселированием на сервере.

Я бы попытался увеличить количество одновременных вызовов и сеансов, чтобы увидеть, помогает ли это чему-либо. Для этого вам нужно добавить serviceThrottling раздел вашего поведения конфигурации на сервере:

<behavior name="Sdd.Services.ControlPanelBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="false" /> 
    <serviceThrottling 
     maxConcurrentCalls="25"   // default is 16 
     maxConcurrentSessions="25"  // default is 10 
     maxConcurrentInstances="25" /> // no default 
</behavior> 

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

Marc

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