Funzionalità di semplificazione WCF

In questo argomento vengono descritte le nuove funzionalità che rendono più semplice la scrittura di applicazioni WCF.

gRPC come alternativa a WCF

gRPC è un framework RPC moderno che rappresenta un'alternativa comune a WCF. gRPC è basato su HTTP/2, che offre numerosi vantaggi rispetto a WCF, tra cui:

  • Prestazioni: gRPC è molto più efficiente di WCF, soprattutto per le connessioni a esecuzione prolungata.
  • Scalabilità: gRPC è progettato per adattarsi a un numero elevato di client e server.
  • Sicurezza: gRPC supporta un'ampia gamma di meccanismi di sicurezza, tra cui TLS e autenticazione.
  • Multipiattaforma: gRPC è indipendente dalla piattaforma e può essere usato con un'ampia gamma di linguaggi di programmazione.

Per altre informazioni sullo sviluppo o la migrazione di app WCF a gRPC, vedere:

File di configurazione generati semplificati

Quando si aggiunge un riferimento al servizio in Visual Studio o si utilizza lo strumento SvcUtil.exe, viene generato un file di configurazione client. Nelle versioni precedenti di WCF, questi file di configurazione contenevano il valore di ogni proprietà di associazione anche se il relativo valore è quello predefinito. In WCF 4.5 i file di configurazione generati contengono soltanto le proprietà di associazione che sono impostate su un valore non predefinito.

Di seguito è riportato un esempio di un file di configurazione generato da WCF 3.0.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false"
                    hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192"
                        maxArrayLength="16384" maxBytesPerRead="4096"
                        maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Di seguito è riportato un esempio dello stesso file di configurazione generato da WCF 4.5.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Sviluppo con priorità al contratto ("contract-first")

WCF supporta ora lo sviluppo con priorità al contratto ("contract-first"). Lo strumento svcutil.exe dispone di un'opzione /serviceContract che consente di generare contratti di servizio e dati da un documento WSDL.

Aggiungere un riferimento al servizio da un progetto di subset portabili

I progetti di subset portabili consentono ai programmatori di assembly .NET di gestire un unico albero di origine e di compilare il sistema supportando allo stesso tempo più implementazioni .NET (desktop, Silverlight, Windows Phone e Xbox). I progetti subset portabili fanno riferimento solo a librerie portabili .NET che sono assembly che possono essere usati in qualsiasi implementazione .NET. L'esperienza dello sviluppatore equivale all'aggiunta di un riferimento al servizio all'interno di qualsiasi altra applicazione client WCF. Per altre informazioni, vedere Aggiungi riferimento al servizio in un progetto di subset portabili.

Modifica dell'impostazione predefinita della modalità di compatibilità ASP.NET

WCF fornisce la modalità di compatibilità ASP.NET per garantire agli sviluppatori l'accesso completo alle funzionalità nella pipeline HTTP ASP.NET in caso di scrittura di servizi WCF. Per utilizzare questa modalità, è necessario impostare l'attributo aspNetCompatibilityEnabled su True nella sezione <serviceHostingEnvironment> di web.config. Inoltre, la proprietà RequirementsMode dell'oggetto AspNetCompatibilityRequirementsAttribute di qualsiasi servizio in questo appDomain deve essere impostata sul campo Allowed o Required. Per impostazione predefinita, l'oggetto AspNetCompatibilityRequirementsAttribute è ora impostato sul campo Allowed e il modello predefinito dell'applicazione del servizio WCF imposta l'attributo aspNetCompatibilityEnabled su true. Per altre informazioni, vedere Novità di Windows Communication Foundation 4.5 e Servizi WCF e ASP.NET.

Miglioramenti del flusso

  • In WCF è stato aggiunto un nuovo supporto per il flusso asincrono. Per abilitare il flusso asincrono, aggiungere il comportamento dell'endpoint DispatcherSynchronizationBehavior all'host del servizio e impostare la relativa proprietà AsynchronousSendEnabled su true. Questa operazione può migliorare la scalabilità quando un servizio sta inviando messaggi trasmessi a più client che leggono lentamente. WCF non blocca più un thread per client e libererà il thread per soddisfare un altro client.

  • Eliminazione delle limitazioni relativamente al buffer dei messaggi quando un servizio è ospitato da IIS. Nelle versioni precedenti di WCF, quando si riceveva un messaggio per un servizio ospitato da IIS che utilizzava il trasferimento dei messaggi di flusso, ASP.NET avrebbe memorizzato nel buffer l'intero messaggio prima di inviarlo a WCF. Questa condizione comportava un elevato consumo di memoria. Questo buffering è stato rimosso in .NET Framework 4.5 e ora i servizi WCF ospitati da IIS possono iniziare l'elaborazione del flusso in ingresso prima che l'intero messaggio sia stato ricevuto, permettendo quindi un flusso vero. In questo modo, WCF risponde immediatamente ai messaggi e consente prestazioni migliori. Inoltre, non è più necessario specificare un valore per maxRequestLength, cioè il limite di dimensioni ASP.NET per le richieste in ingresso. Se questa proprietà è impostata, verrà ignorata. Per altre informazioni su maxRequestLength, vedere l'elemento di configurazione <httpRuntime>. Sarà comunque necessario configurare maxAllowedContentLength. Per altre informazioni, vedere Limiti delle richieste IIS.

Nuovi valori predefiniti di trasporto

Nella tabella seguente vengono descritte le impostazioni che sono state modificate e dove reperire informazioni aggiuntive.

Proprietà Attivato Nuova impostazione predefinita Ulteriori informazioni
channelInitializationTimeout NetTcpBinding 30 secondi Questa proprietà determina il possibile tempo necessario per l'autenticazione di una connessione TCP utilizzando il protocollo .NET Framing. Un client deve inviare alcuni dati iniziali prima che il server disponga di informazioni sufficienti per effettuare l'autenticazione. Questo timeout viene reso intenzionalmente più piccolo rispetto a ReceiveTimeout (10 min) in modo che eventuali client non autenticati dannosi non possano mantenere le connessioni al server per molto tempo. Il valore predefinito è 30 secondi. Per altre informazioni su ChannelInitializationTimeout
listenBacklog NetTcpBinding 16 * il numero di processori È la proprietà a livello di socket che descrive il numero di richieste "in attesa di accettazione" da mettere in coda. Se la coda del backlog in ascolto si riempie, le nuove richieste del socket verranno rifiutate. Per altre informazioni su ListenBacklog
maxPendingAccepts ConnectionOrientedTransportBindingElement

SMSvcHost.exe
2 * il numero di processori per trasporto

4 * il numero di processori per SMSvcHost.exe
Questa proprietà limita il numero di canali che il server può avere in attesa su un listener. Se i dati MaxPendingAccepts sono troppo bassi, si verificherà un piccolo intervallo di tempo in cui tutti canali in attesa hanno avviato connessioni di servizio, ma nessun nuovo canale ha iniziato l'ascolto. Durante questo intervallo può verificarsi una connessione che non riuscirà perché nulla è in sua attesa sul server. Questa proprietà può essere configurata impostando la proprietà MaxPendingConnections su un numero più grande. Per altre informazioni, vedere MaxPendingAccepts e Configurazione del servizio di condivisione delle porte Net.TCP
maxPendingConnections ConnectionOrientedTransportBindingElement 12 * il numero di processori Questa proprietà controlla il numero di connessioni che sono state accettate da un trasporto, ma non prelevate dal dispatcher ServiceModel. Per impostare questo valore, utilizzare MaxConnections nell'associazione o maxOutboundConnectionsPerEndpoint nell'elemento di associazione. Per altre informazioni su MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 secondi Questa proprietà specifica il timeout per la lettura dei dati sui frame TCP e per l'esecuzione dell'invio della connessione dalle connessioni sottostanti. Questa proprietà è utile per applicare un limite al tempo in cui il servizio SMSvcHost.exe viene utilizzato per leggere i dati del preambolo da una connessione in ingresso. Per altre informazioni, vedere Configurazione del servizio di condivisione delle porte Net.TCP.

Nota

Le nuove impostazioni predefinite vengono utilizzate solo se si distribuisce il servizio WCF in un computer con .NET Framework 4.5. Se si distribuisce lo stesso servizio in un computer con .NET Framework 4.0, vengono utilizzati i valori predefiniti di .NET Framework 4.0. In questi casi è consigliabile configurare queste impostazioni in modo esplicito.

XmlDictionaryReaderQuotas

L'oggetto XmlDictionaryReaderQuotas contiene i valori di quota configurabili per lettori di dizionari XML che limitano la quantità di memoria utilizzata da un codificatore durante la creazione di un messaggio. Anche se queste quote sono configurabili, i valori predefiniti sono stati modificati per ridurre la possibilità che uno sviluppatore debba impostarle in modo esplicito. La quota MaxReceivedMessageSize non è stata modificata, pertanto può ancora limitare il consumo di memoria evitando all'utente di dover gestire la complessità dell'oggetto XmlDictionaryReaderQuotas. Nella tabella seguente sono illustrate le quote, i relativi nuovi valori predefiniti e una breve descrizione dell'utilizzo di ciascuna quota.

Nome della quota Valore predefinito Descrizione
MaxArrayLength Int32.MaxValue Ottiene e imposta la lunghezza massima consentita della matrice. Questa quota limita la dimensione massima di una matrice di primitive che viene restituita dal lettore XML, incluse matrici di byte. La quota non limita l'utilizzo di memoria nel lettore XML stesso, bensì in un qualsiasi componente che utilizza il lettore. Ad esempio, quando la classe DataContractSerializer utilizza un lettore protetto con MaxArrayLength, non deserializza matrici di byte che superano questa quota.
MaxBytesPerRead Int32.MaxValue Ottiene e imposta i byte massimi consentiti restituiti per ogni lettura. Questa quota limita il numero di byte letti in una sola operazione di lettura, durante la lettura del tag iniziale dell'elemento e dei relativi attributi. In casi in cui non viene utilizzato il flusso, il nome dell'elemento stesso non viene contato ai fini della quota. La presenza di troppi attributi XML può causare un prolungamento eccessivo dei tempi di elaborazione perché è necessario controllare che i nomi degli attributi siano univoci. Utilizzando la proprietàMaxBytesPerRead la minaccia viene mitigata.
MaxDepth 128 nodi di profondità Questa quota limita la profondità massima di annidamento degli elementi XML. MaxDepth interagisce con MaxBytesPerRead: il lettore mantiene sempre i dati in memoria per l'elemento corrente e tutti i suoi predecessori, pertanto l'utilizzo massimo di memoria da parte del lettore è proporzionale al prodotto di queste due impostazioni. Quando un oggetto grafico profondamente annidato viene deserializzato, il deserializzatore deve utilizzare l'intero stack e generare un'eccezione StackOverflowExceptionirreversibile. Esiste una correlazione diretta tra l'annidamento XML e l'annidamento di oggetti sia per la classe DataContractSerializer sia per la classe XmlSerializer. La proprietà MaxDepth viene utilizzata per mitigare questa minaccia.
MaxNameTableCharCount Int32.MaxValue Questa quota limita il numero massimo di caratteri consentiti in una tabella dei nomi. La tabella NameTable contiene alcune stringhe (ad esempio spazi dei nomi e prefissi) incontrate durante l'elaborazione di un documento XML. Poiché tali stringhe vengono memorizzate nel buffer, questa quota viene utilizzata per impedire la memorizzazione di un'eccessiva quantità di dati nel buffer quando si prevede un flusso.
MaxStringContentLength Int32.MaxValue Questa quota limita la dimensione massima della stringa restituita dal lettore XML e non l'utilizzo di memoria nel lettore XML stesso, bensì nel componente che utilizza il lettore. Ad esempio, quando la classe DataContractSerializer utilizza un lettore protetto con MaxStringContentLength, non deserializza stringhe che superano questa quota.

Importante

Per altre informazioni sulla protezione dei dati, vedere "Utilizzo sicuro di XML" in Considerazioni sulla sicurezza per i dati.

Nota

Le nuove impostazioni predefinite vengono utilizzate solo se si distribuisce il servizio WCF in un computer con .NET Framework 4.5. Se si distribuisce lo stesso servizio in un computer con .NET Framework 4.0, vengono utilizzati i valori predefiniti di .NET Framework 4.0. In questi casi è consigliabile configurare queste impostazioni in modo esplicito.

Convalida della configurazione WCF

Il processo di compilazione in Visual Studio include ora la convalida dei file di configurazione WCF. Se la convalida non riesce, in Visual Studio viene visualizzato un elenco di errori o avvisi di convalida.

Descrizioni comandi dell'editor XML

Per consentire agli sviluppatori di servizi WCF nuovi ed esistenti di configurare i propri servizi, l'editor XML di Visual Studio offre ora le descrizioni comandi per ogni elemento di configurazione e le relative proprietà che fanno parte del file di configurazione del servizio.

Miglioramenti di BasicHttpBinding

  1. Consente a un singolo endpoint WCF di rispondere a diverse modalità di autenticazione.

  2. Consente il controllo delle impostazioni di sicurezza di un servizio WCF da parte di IIS