Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento illustra le nuove funzionalità che semplificano la scrittura di applicazioni WCF.
gRPC come alternativa a WCF
gRPC è un framework RPC moderno che è 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é è consigliabile usare gRPC per 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 usa lo strumento di SvcUtil.exe viene generato un file di configurazione client. Nelle versioni precedenti di WCF questi file di configurazione contengono il valore di ogni proprietà di associazione anche se il relativo valore è il valore predefinito. In WCF 4.5 i file di configurazione generati contengono solo le proprietà di associazione impostate su un valore non predefinito.
Di seguito è riportato un esempio di 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 Contract-First
WCF ora supporta lo sviluppo orientato al contratto. Lo strumento svcutil.exe include un'opzione /serviceContract che consente di generare contratti di servizio e dati da un documento WSDL.
Aggiungere un riferimento al servizio da un progetto subset portabile
I progetti subset portabili consentono ai programmatori di assembly .NET di mantenere un singolo albero di origine e di compilare un sistema, supportando comunque 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 di .NET. L'esperienza di sviluppo equivale all'aggiunta di un riferimento al servizio all'interno di qualsiasi altra applicazione client WCF. Per altre informazioni, vedere Aggiungere riferimenti al servizio in un progetto di subset portabile.
La modalità predefinita di compatibilità di ASP.NET è stata modificata
WCF fornisce ASP.NET modalità di compatibilità per concedere agli sviluppatori l'accesso completo alle funzionalità nella pipeline HTTP ASP.NET durante la scrittura di servizi WCF. Per usare questa modalità, è necessario impostare l'attributo aspNetCompatibilityEnabled
su true nella <sezione serviceHostingEnvironment> di web.config. Inoltre, qualsiasi servizio in questo dominio applicazione deve avere la proprietà RequirementsMode
impostata su AspNetCompatibilityRequirementsAttribute, Allowed o Required. Per impostazione predefinita AspNetCompatibilityRequirementsAttribute , è ora impostato su Allowed e il modello di applicazione del servizio WCF predefinito imposta l'attributo aspNetCompatibilityEnabled
su true
. Per altre informazioni, vedere Novità di Windows Communication Foundation 4.5 e SERVIZI WCF e ASP.NET.
Miglioramenti dello streaming
È stato aggiunto a WCF un nuovo supporto per lo streaming asincrono. Per abilitare il flusso asincrono, aggiungere il comportamento dell'endpoint DispatcherSynchronizationBehavior all'host del servizio e impostare la relativa proprietà AsynchronousSendEnabled su
true
. Ciò può trarre vantaggio dalla scalabilità quando un servizio invia messaggi trasmessi a più client che vengono letti lentamente. WCF non blocca più un thread per client e libera il thread per gestire un altro client.Sono state rimosse limitazioni relative al buffering dei messaggi quando un servizio è ospitato in IIS. Nelle versioni precedenti di WCF quando si riceve un messaggio per un servizio ospitato da IIS che usava il trasferimento di messaggi di streaming, ASP.NET memorizzare nel buffer l'intero messaggio prima di inviarlo a WCF. Ciò provocherebbe un utilizzo elevato della memoria. Questo buffering è stato rimosso in .NET Framework 4.5 e ora i servizi WCF ospitati da IIS possono avviare l'elaborazione del flusso in ingresso prima di ricevere l'intero messaggio, abilitando così un flusso reale. Ciò consente a WCF di rispondere immediatamente ai messaggi e di migliorare le prestazioni. Inoltre, non è più necessario specificare un valore per
maxRequestLength
, il limite di dimensioni ASP.NET per le richieste in ingresso. Se tale proprietà viene impostata, essa viene ignorata. Per ulteriori informazioni sull'elemento di configurazionemaxRequestLength
, vedere <. Sarà comunque necessario configurare maxAllowedContentLength. Per altre informazioni, vedere Limiti delle richieste IIS.
Nuovi valori predefiniti per il trasporto
Nella tabella seguente vengono descritte le impostazioni modificate e la posizione in cui trovare informazioni aggiuntive.
Proprietà | Attivato | Nuovo valore predefinito | Altre informazioni |
---|---|---|---|
timeoutDiInizializzazioneDelCanale | NetTcpBinding | 30 secondi | Questa proprietà determina il tempo necessario per l'autenticazione di una connessione TCP tramite il protocollo .NET Framing. Un client deve inviare alcuni dati iniziali prima che il server disponga di informazioni sufficienti per eseguire l'autenticazione. Questo timeout è intenzionalmente ridotto rispetto a ReceiveTimeout (10 minuti) in modo che i client non autenticati malintenzionati non mantengano le connessioni collegate al server per molto tempo. Il valore predefinito è 30 secondi. Per altre informazioni su ChannelInitializationTimeout |
listenBacklog (accodamento di ascolto) | NetTcpBinding | 16 * numero di processori | Questa proprietà a livello di socket descrive il numero di richieste di accettazione pendenti da inserire in coda. Se la coda di backlog di ascolto si riempie, verranno rifiutate le nuove richieste di socket. Per altre informazioni su ListenBacklog |
maxPendingAccepts | ConnectionOrientedTransportBindingElement SMSvcHost.exe |
2 * numero di processori per il trasporto 4 * numero di processori per SMSvcHost.exe |
Questa proprietà limita il numero di canali che il server può avere in attesa in un listener. Quando MaxPendingAccepts è troppo basso, ci sarà un breve intervallo di tempo in cui tutti i canali in attesa hanno avviato le connessioni di manutenzione, ma non sono stati avviati nuovi canali in ascolto. Una connessione può arrivare durante questo intervallo e avrà esito negativo perché sul server non c'è nulla in attesa per essa. Questa proprietà può essere configurata impostando la MaxPendingConnections proprietà su un numero maggiore. Per altre informazioni, vedere MaxPendingAccepts e Configurazione del servizio di condivisione delle porte Net.TCP |
maxPendingConnections | ConnectionOrientedTransportBindingElement | 12 * numero di processori | Questa proprietà controlla quante connessioni sono state accettate da un trasporto ma non sono state prese in carico dal Dispatcher ServiceModel. Per impostare questo valore, utilizzare MaxConnections sull'associazione o maxOutboundConnectionsPerEndpoint sull'elemento di associazione. Per altre informazioni su MaxPendingConnections |
receiveTimeout | SMSvcHost.exe | 30 secondi | Questa proprietà specifica il timeout per la lettura dei dati del frame TCP e l'esecuzione dell'invio della connessione dalle connessioni sottostanti. Ciò esiste per mettere un limite massimo al periodo in cui il servizio SMSvcHost.exe viene mantenuto impegnato per leggere i dati di preambolo da una connessione in ingresso. Per ulteriori informazioni, vedere Configurazione del servizio di condivisione delle porte Net.TCP. |
Annotazioni
Queste nuove impostazioni predefinite vengono usate 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 usate le impostazioni predefinite di .NET Framework 4.0. In questi casi è consigliabile configurare queste impostazioni in modo esplicito.
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas contiene valori di quota configurabili per i lettori di dizionario XML che limitano la quantità di memoria utilizzata da un codificatore durante la creazione di un messaggio. Sebbene queste quote siano configurabili, i valori predefiniti sono stati modificati per ridurre la possibilità che uno sviluppatore debba impostarli in modo esplicito.
MaxReceivedMessageSize
la quota non è stata modificata in modo tale da poter comunque limitare il consumo di memoria ed evitare che l'utente debba affrontare la complessità dell'oggetto XmlDictionaryReaderQuotas. Nella tabella seguente vengono illustrate le quote, i nuovi valori predefiniti e una breve spiegazione dell'utilizzo di ogni quota.
Nome quota | Valore predefinito | Descrizione |
---|---|---|
MaxArrayLength | Int32.MaxValue | Ottiene e imposta la lunghezza massima consentita della matrice. Questa quota limita le dimensioni massime di una matrice di primitive restituite dal lettore XML, incluse le matrici di byte. Questa quota non limita il consumo di memoria nel lettore XML stesso, ma in qualsiasi componente che utilizza il lettore. Ad esempio, quando DataContractSerializer usa un lettore protetto con MaxArrayLength, non deserializza matrici di byte maggiori di 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 singola operazione di lettura durante la lettura del tag iniziale dell'elemento e dei relativi attributi. Nei casi non trasmessi, il nome dell'elemento stesso non viene conteggiato rispetto alla quota. La presenza di troppi attributi XML può richiedere tempi di elaborazione sproporzionati perché è necessario verificare l'univocità dei nomi degli attributi. MaxBytesPerRead attenua questa minaccia. |
MaxDepth | 128 nodi profondi | 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 relativi predecessori, quindi il consumo massimo di memoria del lettore è proporzionale al prodotto di queste due impostazioni. Quando si deserializza un grafo di oggetti annidato in modo approfondito, il deserializzatore viene forzato ad accedere all'intero stack e generare un'eccezione irreversibile StackOverflowException. Esiste una correlazione diretta tra l'annidamento XML e l'annidamento di oggetti sia per DataContractSerializer che per XmlSerializer. MaxDepth viene usato per attenuare questa minaccia. |
MaxNameTableCharCount | Int32.MaxValue | Questa quota limita il numero massimo di caratteri consentiti in una tabella dei nomi. La tabella dei nomi contiene determinate stringhe, ad esempio spazi dei nomi e prefissi, rilevati durante l'elaborazione di un documento XML. Poiché queste stringhe vengono memorizzate nel buffer in memoria, questa quota viene usata per evitare un buffering eccessivo quando è previsto lo streaming. |
MaxStringContentLength | Int32.MaxValue | Questa quota limita le dimensioni massime della stringa restituite dal lettore XML. Questa quota non limita il consumo di memoria nel lettore XML stesso, ma nel componente che usa il lettore. Ad esempio, quando DataContractSerializer usa un lettore protetto con MaxStringContentLength, non deserializza stringhe superiori a questa quota. |
Importante
Per altre informazioni sulla protezione dei dati, vedere "Uso sicuro di XML" in Considerazioni sulla sicurezza per i dati.
Annotazioni
Queste nuove impostazioni predefinite vengono usate 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 usate le impostazioni predefinite di .NET Framework 4.0. In questi casi è consigliabile configurare queste impostazioni in modo esplicito.
Convalida della configurazione WCF
Nell'ambito del processo di compilazione all'interno di Visual Studio, i file di configurazione WCF vengono ora convalidati. In Visual Studio viene visualizzato un elenco di errori o avvisi di convalida se la convalida ha esito negativo.
Suggerimenti dell'editor XML
Per consentire agli sviluppatori di servizi WCF nuovi ed esistenti di configurare i servizi, l'editor XML di Visual Studio fornisce ora descrizioni comando 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 di controllare le impostazioni di sicurezza di un servizio WCF tramite IIS