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:
- Perché gRPC è consigliato per gli sviluppatori WCF
- Confronto tra WCF e gRPC
- Introduzione a gRPC per sviluppatori WCF
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 sumaxRequestLength
, 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
Consente a un singolo endpoint WCF di rispondere a diverse modalità di autenticazione.
Consente il controllo delle impostazioni di sicurezza di un servizio WCF da parte di IIS