Condividi tramite


Funzionalità di semplificazione WCF

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:

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 configurazione maxRequestLength, 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

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

  2. Consente di controllare le impostazioni di sicurezza di un servizio WCF tramite IIS