[C#] Problema misterioso in WCF e IIS?


Answers

Prima di tutto Duplex è cattivo (davvero pessimo), ma non ne parlerò da quando hai preso la decisione di usarlo.

Il problema principale che posso vedere è la sicurezza . Sono sicuro che windows eventlog ti racconterà storie su questo - basta controllare gli errori nel registro di sicurezza. Per impostazione predefinita, i pool di applicazioni IIS non sono autorizzati a comunicare con altre macchine. Non hai detto che hai fatto qualcosa in modo specifico, quindi presumo che sia tutto predefinito. Basta cambiare l'identità del Pool di App a un utente amministratore (non è consigliabile per la produzione) e penso che vedrai il tuo problema scomparire, suppongo.

OFF-TOPIC: PERCHÉ DUPLEX È MALE

  • Con il server che tenta di stabilire una connessione con il client, riduce notevolmente la scalabilità del servizio. Infatti se il client ha una cattiva connessione o ... la connessione del server potrebbe essere sospesa fino a quando scade durante il tempo, tutte le risorse dedicate a quella chiamata saranno bloccate quindi sprecate.
  • Le specifiche del computer client e la sua connessione possono influire sulle prestazioni del servizio.
  • Per il server di solito si assicura che sia accessibile. Se il client si trova dietro un firewall o NAT, non possono contattare il server. [ QUESTO IN FATTO POTREBBE ESSERE IL TUO PROBLEMA ].
  • Quindi se apri il client per il server, significa che il client potrebbe essere esposto anche a tutto il mondo. Le considerazioni sulla sicurezza dei server sono generalmente buone ma i client vengono ignorati, quindi è necessario prendere in considerazione un sacco di cose.
  • E ce ne sono altri ... ma dovrebbe bastare.
Question

Ciao
Ho scritto il WCF duplex service . Questo servizio funziona bene in Visual Studio ma quando pubblico questo servizio e lo metto su IIS, il Service don't answer to any Client .
Tutti i client si collegano correttamente a questo servizio. Inoltre chiamano Servizio Bene e non si verificano eccezioni.
Solo diverso tra questi servizi (servizio IIS e servizio VS ospitato) è l'indirizzo. Per esempio :
* L'indirizzo del servizio IIS è http: //localhost/SmsService/SmsService.svc o, meglio dire, è l'indirizzo del percorso virtuale.
* L'indirizzo del servizio VS ospitato è http: // localhost: 1408 / SmsSrevice.svc . assolutamente I changed Server address for client's.

Qui Service / App Config's:
VS Servizio in hosting

<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>

Servizio ospitato da IIS

    <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>

Configurazione client

  <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>

Anche io ho scritto il log degli eventi nel primo metodo di servizio, ma questo non funziona!

Allora, qual è il problema?

Modifica 1

Prima grazie a tutti

Secondo, penso, non spiego chiaramente la mia domanda. "Questo servizio funziona bene in Visual Studio" si riferisce a VS posso comunicare con il server tramite client (sulla stessa soluzione in VS con servizio). Il client può chiamare il servizio e anche il servizio può chiamare il client e il lavoro va bene (qualsiasi calcolo, richiamata, database-azioni e così via)

Ma quando pubblico quel servizio che fa autonomamente il lavoro in VS, in IIS che non funziona bene (anche nel mio computer). Ciò significa che il Client can create service object and connect to that IIS Hosted Service , ma quando il servizio di chiamata del cliente non presenta alcun evento (calcolo, callback, azioni del database) e Service also don't call Client's .

Non capisco, se qualsiasi passaggio del mio codice ha avuto errori che devono verificarsi in fase di esecuzione in VS. Quindi deve essere qualcosa che mi è mancato come la security config, client side config or something else