2015-02-20 4 views
-1

Я пытаюсь настроить некоторые тесты, чтобы увидеть, как работают службы WCF. У меня есть код, подобный этому для basicHttp, netTcp, привязок netPipe, вызывающих службу WCF с этими привязками.Wcf Service net.tcp вызывает ошибки

using (_log = new StreamWriter(@"C:\TestRunnerLog.txt", true)) 
{ 
    var methodCallInformation = new MethodCallInformation { Method = NetPipeServiceCall, TotalTimeTakenForAllMethodCalls = new TimeSpan(), TotalNumberOfTimesMethodCalled = 0, TimesErrored = 0 }; 

    for (var i = 0; i < 25000; i++) 
    { 
     try 
     { 
      var stopwatch = new Stopwatch(); 
      stopwatch.Start(); 
      using(var channelFactory = new ChannelFactory<IChatHub>(new NetTcpBinding { Security = new NetTcpSecurity { Mode = SecurityMode.None } }, "net.tcp://localhost/test/test.svc")) 
      { 
       var channel = channelFactory.CreateChannel(); 
       await channel.GetPeople(); 
      } 
      stopwatch.Stop(); 
      return stopwatch.Elapsed; 

      methodCallInformation.TotalTimeTakenForAllMethodCalls += stopwatch.Elapsed; 
     } 
     catch (Exception e) 
     { 
      methodCallInformation.TimesErrored++; 
     } 

     methodCallInformation.TotalNumberOfTimesMethodCalled++; 
    } 

    await _log.WriteLineAsync(string.Format("net.tcp:\tTimesCalled:{0}\tTotalTime:{1}\tAverageTime:{2}\tErrors:{3}", methodCallInformation.TotalNumberOfTimesMethodCalled, methodCallInformation.TotalTimeTakenForAllMethodCalls, new TimeSpan(methodCallInformation.TotalTimeTakenForAllMethodCalls.Ticks/methodCallInformation.TotalNumberOfTimesMethodCalled), methodCallInformation.TimesErrored)); 
} 

Я смущен результатами, которые я получаю. Я выполняю все итерации локально и имею службу и клиент, все из которых выполняются локально на моей машине. Основываясь на моих исследованиях, netPipe должен быть самым быстрым, за ним следует netTcp, а затем basicHttp. Код, который я произволью для этих вызовов, вместо каждого цикла вызывает только одно связывание для всех итераций, как в примере выше.

---------------------------------------------------------------------------------------------- 
http:  TimesCalled:24981 TotalTime:00:00:46.0452454 AverageTime:00:00:00.0018432 Errors:0 
net.tcp: TimesCalled:25168 TotalTime:00:00:16.7776697 AverageTime:00:00:00.0006666 Errors:17593 
net.pipe: TimesCalled:24786 TotalTime:00:00:50.5698790 AverageTime:00:00:00.0020402 Errors:0 

Я пытаюсь выяснить, что я делаю неправильно, чтобы получить все эти ошибки с net.tcp и почему сроки кажется настолько медленным для net.pipe.

Вот привязок я настроил на обслуживание:

<bindings> 
    <basicHttpBinding> 
     <binding name="basicHttpDefaultBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"> 
      <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <security mode="None"> 
       <transport clientCredentialType="None" /> 
      </security> 
     </binding> 
    </basicHttpBinding> 
    <netTcpBinding> 
     <binding name="netTcpDefaultBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <security mode="None"> 
       <transport clientCredentialType="None" /> 
       <message clientCredentialType="None" /> 
      </security> 
     </binding> 
    </netTcpBinding> 
    <netNamedPipeBinding> 
     <binding name="netNamedPipeDefaultBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <security mode="None"> 
      </security> 
     </binding> 
    </netNamedPipeBinding> 
</bindings> 

Любая помощь будет высоко ценится.

+0

Просьба дать обратную связь. Почему голос? – peinearydevelopment

+0

вы на самом деле не задали вопрос. –

+0

Извините, если это не было очевидно, но у меня было это в сообщении: я пытаюсь выяснить, что я делаю неправильно, чтобы получить все эти ошибки с net.tcp и почему время кажется таким медленным для net.pipe. Чтобы добавить к этому. Я не правильно создаю связи или распоряжаюсь ими? Почему я должен видеть это поведение? – peinearydevelopment

ответ

0

Ваш тест NetTcp, скорее всего, завершается намного быстрее из-за того, что он выбрасывает исключение ~ 17 000 из ~ 25 000 раз. Вы более или менее просто проверяете, насколько быстро ваше приложение может генерировать исключения.

Запуск локально, различия между привязками будут почти незаметными, и факторов окружающей среды, вероятно, будет достаточно, чтобы исказить результаты. По сети результаты могут быть разными, в первую очередь из-за кодирования сообщения (двоичный и текстовый с более эффективным двоичным кодом). Надеюсь, вы ответите на вопрос о том, почему Named Pipes «медленны» по сравнению с NetTcp.

Во-вторых, чтобы определить, почему NetTcp не работает, вам необходимо прекратить скрывать исключение.

catch (Exception e) 
    { 
     // you should also be reporting your exception somewhere here... 
     methodCallInformation.TimesErrored++; 

    } 

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

+0

Благодарим за отзыв. Я попытаюсь собрать информацию об исключениях. Я начал с небольшого количества итераций и продолжал увеличивать его. ~ 7500 звонков не выдавали ошибок для tcp, но как только я начал ~ 10000, когда начались ошибки и почему я подозревал, что вам не удалось использовать их. Насколько я могу судить, все три протокола http и протокола должны быть самыми быстрыми в одном окне, tcp должен работать лучше в сети и http для кросс-сетей. Имеет смысл, что я увижу ухудшающуюся производительность, если я перевешу службу в другую коробку, но это пик для всех из них? – peinearydevelopment

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