Загадочная проблема в WCF и IIS? - PullRequest
4 голосов
/ 24 ноября 2010

Привет
Я написал WCF duplex service.Этот сервис работает нормально в Visual studio, но когда я публикую этот сервис и помещу его в IIS, Service don't answer to any Client.
Все клиенты правильно подключаются к этому сервису.Также они называют Service Well, и исключений не возникает.
Только с этими службами (службой IIS и размещенной службой VS) отличается только адрес.Например:
* Адрес службы IIS: http://localhost/SmsService/SmsService.svc или, лучше сказать, адрес виртуального пути.
* Адрес размещенной службы VS: http://localhost:1408/SmsSrevice.svc. абсолютно I changed Server address for client's.

Конфигурация службы / приложения:
VS Hosted Service

<system.serviceModel>
<services>
  <service name="SmsService.Business.SmsService"
           behaviorConfiguration="ServiceBehavior">
    <endpoint address="http://localhost:1408/SmsService.svc"
              binding="wsDualHttpBinding"
              contract="SmsService.Business.ISmsService">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

IIS Hosted Service

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

Client Config

  <system.serviceModel>
<bindings>
  <wsDualHttpBinding>
    <binding name="WSDualHttpBinding_SMSService"
             closeTimeout="00:10:00"
             clientBaseAddress="http://MyMachinName:10300/SmsClientService"
             openTimeout="00:01:00" 
             receiveTimeout="00:10:00" 
             sendTimeout="00:10: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://SERVER1/SmsService/SmsService.svc" 
            binding="wsDualHttpBinding"
            bindingConfiguration="WSDualHttpBinding_SMSService" 
            contract="ServiceReference.SMSService"
            name="WSDualHttpBinding_SMSService">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>

Даже я записал журнал событий первым методом обслуживания, но это не работает!

Так в чем проблема?

Редактировать 1

Первое спасибо всем

Второе, я думаюЯ не объясняю свой вопрос четко.«Этот сервис прекрасно работает в Visual Studio», в VS я могу общаться с сервером через клиента (на том же решении в VS с сервисом).Клиент может вызывать службу, а служба может вызывать клиента, и все в порядке (любые вычисления, обратные вызовы, действия с базой данных и т. Д.)

Но когда я публикую эту службу, которая выполняет свою работу должным образом в VS, в IISэто не работает нормально (даже на моем собственном компьютере).Это означает Client can create service object and connect to that IIS Hosted Service, но когда у клиента службы вызовов нет событий (расчет, обратный вызов, действия базы данных) и Service also don't call Client's.

Я не понимаю, если на каком-либо этапе моего кода были ошибки, которые должны происходить во время выполнения в VS.Так что должно быть что-то, что я пропустил, как security config, client side config or something else

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

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

Основная проблема, которую я вижу, это безопасность .Я уверен, что Windows Eventlog расскажет вам истории об этом - просто проверьте ошибки в журнале безопасности.По умолчанию пулы приложений IIS не могут взаимодействовать с другими компьютерами.Вы не упомянули, что специально что-то сделали с этим, поэтому я предполагаю, что это все по умолчанию.Просто измените Идентичность пула приложений на пользователя с правами администратора (хотя он и не рекомендуется для производства), и я думаю, что вы увидите, что ваша проблема исчезнет - я просто догадываюсь.


OFF-TOPICПОЧЕМУ ДУПЛЕКС ПЛОХО

  • Когда сервер пытается установить соединение с клиентом, это значительно снижает масштабируемость службы.Фактически, если у клиента плохое соединение или ... соединение с сервером может зависать там, пока не истечет время, в течение которого все ресурсы, выделенные для этого вызова, будут заблокированы, следовательно, потрачены впустую.Машина и ее подключение могут повлиять на производительность службы.
  • Для сервера обычно проверяется его доступность.Если клиент находится за брандмауэром или NAT, он не может связаться с сервером.[ ЭТО НА ФАКТЕ МОЖЕТ БЫТЬ ВАШЕЙ ПРОБЛЕМОЙ ].
  • Таким образом, если вы откроете клиент для сервера, это означает, что клиент также может быть подвержен воздействию всего мира.Соображения безопасности для серверов, как правило, хороши, но клиентов они игнорируют, поэтому нужно учитывать множество вещей.
  • И есть еще ... но этого должно быть достаточно.

2 голосов
/ 24 ноября 2010

Это может быть брандмауэр, который блокирует порт 1408

0 голосов
/ 24 ноября 2010

вы можете открыть http://localhost:1408/SmsSrevice.svc в своем браузере? Если нет, проверьте свою конфигурацию IIS. http://msdn.microsoft.com/en-us/library/ms733766.aspx

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