Domanda

Ho due siti Web sulla stessa macchina. Il primo (client) fa riferimento a un servizio WCF sul secondo sito (server).

Come posso impostare l'indirizzo per il riferimento del servizio? Quando si passa dallo sviluppo sul mio computer locale al server di sviluppo del gruppo, come posso modificare l'URL per il servizio? I siti sono differenziati per intestazioni host, come http: //dev.admin/ ... e http: //dev.public/ ...

Sento che questo può essere gestito usando più endpoint, ma sono molto nuovo in WCF e non ho idea di cosa sto facendo qui.

È stato utile?

Soluzione

Dopo molte frustrazioni, sono riuscito a determinare che entrambi i file web.config (sul client e sul server, entrambi in questo caso app Web), devono essere modificate le seguenti sezioni:

Cliente:

   <client>
      <endpoint 
        address="http://mysite.com:port/services/someservice.svc"
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_ISomeService"
        contract="MyServices.ISomeService" 
        name="BasicHttpBinding_ISomeService" />

    </client>
  </system.serviceModel>

Server

 <system.serviceModel>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://mysite.com:port/services"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServices.SomeServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MyServices.SomeServiceBehavior"
        name="MyServices.SomeService">
          <endpoint address="http://mysite.com:port/services/someservice.svc" 
                    name="endpoint.SomeService"
                    binding="basicHttpBinding" 
                    bindingConfiguration="" 
                    contract="MyServices.ISomeService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

La cosa da notare qui è che l'indirizzo host in tutte e tre le sezioni pertinenti (indirizzo endpoint client, valore baseAddressPrefixFilter client e indirizzo endpoint server) devono corrispondere.

Sono in grado di passare da un server all'altro modificandoli, purché corrispondano. Preferirei comunque un modo per impostare questo in base alla macchina su cui è in esecuzione il server, ma per il momento funziona.

Impressioni WCF Cosa c'è di caldo: oggetto persistente. L'oggetto proxy client (creato quando si aggiunge un riferimento al servizio) mantiene una connessione persistente al servizio sul server. L'istanza del servizio a cui fa riferimento il proxy client mantiene il suo stato tra le chiamate, il che può semplificare le firme dei metodi e rendere l'oggetto proxy client e il servizio nel suo insieme, molto più utili per alcune applicazioni. I tipi di oggetto parametro possono essere condivisi tra il client e il server se sono dichiarati in una libreria comune, il che significa che non è necessario creare due classi molto simili o classi wrapper per passare avanti e indietro strutture di dati non primitive.

Cosa non lo è: la configurazione è un dolore reale, scarsamente documentato e fin troppo coinvolto. Far funzionare questo in una configurazione di ambiente di test / sviluppo / staging / produzione in cui il servizio deve essere consapevole della sua posizione è frustrante. Non sono convinto che rendere il servizio consapevole dell'URL del suo dominio (piuttosto che, diciamo, un percorso relativo a qualunque cosa stia funzionando) ha qualche vantaggio significativo, a parte i problemi di sicurezza.

Detto questo, continuo a seguire il percorso WCF poiché i vantaggi finora superano i mal di testa.

Altri suggerimenti

Il modo più semplice: eseguire le parti WCF su porte diverse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top