Note sulla versione di ASP.NET and Web Tools per Visual Studio 2013

da Microsoft

Questo documento descrive il rilascio di ASP.NET and Web Tools per Visual Studio 2013.

Contenuto

Nuove funzionalità in ASP.NET and Web Tools per Visual Studio 2013

Note di installazione

ASP.NET and Web Tools per Visual Studio 2013 vengono raggruppati nel programma di installazione principale e possono essere scaricati qui.

Documentazione

Le esercitazioni e altre informazioni sui ASP.NET and Web Tools per Visual Studio 2013 sono disponibili dal sito Web ASP.NET.

Requisiti software

ASP.NET and Web Tools richiede Visual Studio 2013.

Nuove funzionalità in ASP.NET and Web Tools per Visual Studio 2013

Le sezioni seguenti descrivono le funzionalità introdotte nella versione.

Un ASP.NET

Con la versione di Visual Studio 2013, abbiamo fatto un passo verso l'unificazione dell'esperienza di uso di tecnologie ASP.NET, in modo che sia possibile combinare facilmente e corrispondere a quelli desiderati. Ad esempio, è possibile avviare un progetto usando MVC e aggiungere facilmente pagine Web Forms al progetto in un secondo momento o eseguire lo scaffold Web API in un progetto di Web Forms. Una ASP.NET è tutto ciò che ti rende più facile per te come sviluppatore di fare le cose che ami in ASP.NET. Indipendentemente dalla tecnologia scelta, è possibile avere fiducia nel framework sottostante attendibile di One ASP.NET.

Nuova esperienza del progetto Web

Abbiamo migliorato l'esperienza di creazione di nuovi progetti Web in Visual Studio 2013. Nella finestra di dialogo Nuovo progetto Web ASP.NET è possibile selezionare il tipo di progetto desiderato, configurare qualsiasi combinazione di tecnologie (Web Forms, MVC, API Web), configurare le opzioni di autenticazione e aggiungere un progetto di unit test.

Nuovo progetto ASP.NET

La nuova finestra di dialogo consente di modificare le opzioni di autenticazione predefinite per molti modelli. Ad esempio, quando si crea un progetto Web Forms ASP.NET è possibile selezionare una delle opzioni seguenti:

  • Nessuna autenticazione
  • Singoli account utente (appartenenza ASP.NET o accesso al provider di social social network)
  • Account aziendali (Active Directory in un'applicazione Internet)
  • Autenticazione di Windows (Active Directory in un'applicazione Intranet)

Opzioni di autenticazione

Per altre informazioni sul nuovo processo per la creazione di progetti Web, vedere Creazione di progetti Web ASP.NET in Visual Studio 2013. Per altre informazioni sulle nuove opzioni di autenticazione, vedere ASP.NET Identity più avanti in questo documento.

ASP.NET Scaffolding

ASP.NET Scaffolding è un framework di generazione di codice per le applicazioni Web ASP.NET. Semplifica l'aggiunta di codice boilerplate al progetto che interagisce con un modello di dati.

Nelle versioni precedenti di Visual Studio, il scaffolding era limitato ai progetti MVC ASP.NET. Con Visual Studio 2013 è ora possibile usare scaffolding per qualsiasi progetto di ASP.NET, tra cui Web Forms. Visual Studio 2013 attualmente non supporta la generazione di pagine per un progetto di Web Forms, ma è comunque possibile usare scaffolding con Web Forms aggiungendo dipendenze MVC al progetto. Il supporto per la generazione di pagine per Web Forms verrà aggiunto in un aggiornamento futuro.

Quando si usa scaffolding, assicurarsi che tutte le dipendenze necessarie vengano installate nel progetto. Ad esempio, se si inizia con un progetto Web Forms ASP.NET e quindi si usa scaffolding per aggiungere un controller API Web, i pacchetti e i riferimenti NuGet necessari vengono aggiunti automaticamente al progetto.

Per aggiungere scaffolding MVC a un progetto Web Forms, aggiungere un nuovo elemento Scaffolded e selezionare Dipendenze MVC 5 nella finestra di dialogo. Esistono due opzioni per scaffolding MVC; Minimo e pieno. Se si seleziona Minimo, vengono aggiunti al progetto solo i pacchetti e i riferimenti NuGet per ASP.NET MVC. Se si seleziona l'opzione Full, vengono aggiunte le dipendenze minime e i file di contenuto necessari per un progetto MVC.

Il supporto per i controller asincroni di scaffolding usa le nuove funzionalità asincrone di Entity Framework 6.

Per altre informazioni ed esercitazioni, vedere panoramica ASP.NET Scaffolding.

La nuova funzionalità Collegamento browser consente di connettere più browser a Visual Studio e aggiornarli tutti facendo clic su un pulsante sulla barra degli strumenti. È possibile connettere più browser al sito di sviluppo, inclusi emulatori per dispositivi mobili e fare clic su Aggiorna per aggiornare tutti i browser contemporaneamente. Il collegamento del browser espone anche un'API per consentire agli sviluppatori di scrivere estensioni di collegamento browser.

Screenshot del menu di Visual Studio, con icona Aggiorna evidenziata e Dashboard collegamento browser evidenziato nel menu a discesa.

Consentendo agli sviluppatori di sfruttare l'API Collegamento browser, diventa possibile creare scenari molto avanzati che superano i limiti tra Visual Studio e qualsiasi browser connesso. Web Essentials sfrutta l'API per creare un'esperienza integrata tra Visual Studio e gli strumenti di sviluppo del browser, controllo remoto di emulatori per dispositivi mobili e molto altro ancora.

Miglioramenti dell'editor Web di Visual Studio

Visual Studio 2013 include un nuovo editor HTML per i file Razor e i file HTML nelle applicazioni Web. Il nuovo editor HTML fornisce un unico schema unificato basato su HTML5. Include il completamento automatico della parentesi graffe, l'interfaccia utente jQuery e l'attributo AngularJS IntelliSense, il raggruppamento intelliSense, l'ID e il nome della classe IntelliSense e altri miglioramenti, tra cui prestazioni migliori, formattazione e SmartTag.

Lo screenshot seguente illustra l'uso dell'attributo Bootstrap IntelliSense nell'editor HTML.

Intellisense nell'editor HTML

Visual Studio 2013 include anche editor CoffeeScript e LESS incorporati. L'editor LESS include tutte le funzionalità interessanti dell'editor CSS e include intellisense specifici per le variabili e le mixins in tutti i documenti LESS della @import catena.

Servizio app di Azure App Web supporto in Visual Studio

In Visual Studio 2013 con Azure SDK per .NET 2.2, è possibile usare Esplora server per interagire direttamente con le app Web remote. È possibile accedere all'account Azure, creare nuove app Web, configurare app, visualizzare i log in tempo reale e altro ancora. Presto dopo il rilascio di SDK 2.2, sarà possibile eseguire in modalità di debug in remoto in Azure. La maggior parte delle nuove funzionalità per Servizio app di Azure App Web funziona anche in Visual Studio 2012 quando si installa la versione corrente di Azure SDK per .NET.

Per altre informazioni, vedere le risorse seguenti:

Miglioramenti alla pubblicazione Web

Visual Studio 2013 include funzionalità di pubblicazione Web nuove e avanzate. Alcuni esempi sono i seguenti:

Per altre informazioni sulla distribuzione Web di ASP.NET, vedere il sito ASP.NET.

NuGet 2.7

NuGet 2.7 include un set completo di nuove funzionalità descritte in dettaglio nelle note sulla versione di NuGet 2.7.

Questa versione di NuGet rimuove anche la necessità di fornire il consenso esplicito per la funzionalità di ripristino dei pacchetti Di NuGet per scaricare i pacchetti. Il consenso (e la casella di controllo associata nella finestra di dialogo delle preferenze di NuGet) viene ora concessa installando NuGet. Ora il ripristino del pacchetto funziona semplicemente per impostazione predefinita.

Web Form ASP.NET

Una ASP.NET

I modelli di progetto Web Forms si integrano perfettamente con la nuova esperienza di ASP.NET One. È possibile aggiungere il supporto di MVC e API Web al progetto di Web Forms ed è possibile configurare l'autenticazione usando la creazione guidata di un progetto di One ASP.NET. Per altre informazioni, vedere Creazione di progetti Web ASP.NET in Visual Studio 2013.

Identità ASP.NET

I modelli di progetto Web Forms supportano il nuovo framework di gestione delle identità di ASP.NET. Inoltre, i modelli supportano ora la creazione di un progetto Intranet Web Forms. Per altre informazioni, vedere Metodi di autenticazione in Creazione di progetti Web ASP.NET in Visual Studio 2013.

Bootstrap

I modelli Web Forms usano Bootstrap per offrire un aspetto elegante e reattivo che è possibile personalizzare facilmente. Per altre informazioni, vedere Bootstrap nei modelli di progetto Web Visual Studio 2013.

ASP.NET MVC 5

Una ASP.NET

I modelli di progetto Web MVC si integrano perfettamente con la nuova esperienza one ASP.NET. È possibile personalizzare il progetto MVC e configurare l'autenticazione usando la creazione guidata one ASP.NET progetto. Un'esercitazione introduttiva per ASP.NET MVC 5 è disponibile in Introduzione con ASP.NET MVC 5.

Per informazioni sull'aggiornamento di progetti MVC 4 a MVC 5, vedere Come aggiornare un ASP.NET MVC 4 e un progetto API Web a ASP.NET MVC 5 e API Web 2.

Identità ASP.NET

I modelli di progetto MVC sono stati aggiornati per usare ASP.NET Identity per l'autenticazione e la gestione delle identità. Un'esercitazione con l'autenticazione di Facebook e Google e la nuova API di appartenenza sono disponibili in Creare un'app MVC 5 ASP.NET con Facebook e Google OAuth2 e OpenID Sign-On e Creare un'app MVC ASP.NET con autenticazione e database SQL e distribuirla in Servizio app di Azure.

Bootstrap

Il modello di progetto MVC è stato aggiornato per usare Bootstrap per offrire un aspetto elegante e reattivo che è possibile personalizzare facilmente. Per altre informazioni, vedere Bootstrap nei modelli di progetto Web Visual Studio 2013.

Filtri di autenticazione

I filtri di autenticazione sono un nuovo tipo di filtro in ASP.NET MVC eseguito prima dei filtri di autorizzazione nella pipeline ASP.NET MVC e consentono di specificare la logica di autenticazione per azione, per controller o a livello globale per tutti i controller. I filtri di autenticazione elaborano le credenziali nella richiesta e forniscono un'entità corrispondente. I filtri di autenticazione possono anche aggiungere problemi di autenticazione in risposta a richieste non autorizzate.

Sostituzioni di filtro

È ora possibile eseguire l'override dei filtri applicati a un determinato metodo di azione o controller specificando un filtro di override. I filtri di override specificano un set di tipi di filtro che non devono essere eseguiti per un determinato ambito (azione o controller). In questo modo è possibile configurare filtri che si applicano a livello globale, ma quindi escludere determinati filtri globali dall'applicazione a azioni o controller specifici.

Routing con attributi

ASP.NET MVC supporta ora il routing degli attributi, grazie a un contributo di Tim McCall, l'autore di http://attributerouting.net. Con il routing degli attributi è possibile specificare le route annotando le azioni e i controller.

API Web ASP.NET 2

Routing con attributi

API Web ASP.NET ora supporta il routing degli attributi, grazie a un contributo di Tim McCall, l'autore di http://attributerouting.net. Con il routing degli attributi è possibile specificare le route dell'API Web annotando le azioni e i controller in questo modo:

[RoutePrefix("orders")] 
public class OrdersController : ApiController 
{ 
    [Route("{id}")] 
    public Order Get(int id) { } 
    [Route("{id}/approve")] 
    public Order Approve(int id) { } 
}

Il routing degli attributi offre un maggiore controllo sugli URI nell'API Web. Ad esempio, è possibile definire facilmente una gerarchia di risorse usando un singolo controller API:

public class MoviesController : ApiController 
{ 
    [Route("movies")] 
    public IEnumerable<Movie> Get() { } 
    [Route("actors/{actorId}/movies")] 
    public IEnumerable<Movie> GetByActor(int actorId) { } 
    [Route("directors/{directorId}/movies")] 
    public IEnumerable<Movie> GetByDirector(int directorId) { } 
}

Il routing degli attributi fornisce anche una sintassi utile per specificare parametri facoltativi, valori predefiniti e vincoli di route:

// Optional parameter
[Route("people/{name?}")]
// Default value
[Route("people/{name=Dan}")]
// Constraint: Alphabetic characters only. 
[Route("people/{name:alpha}")]

Per altre informazioni sul routing degli attributi, vedere Routing degli attributi nell'API Web 2.

OAuth 2.0

I modelli di progetto API Web e Applicazione a pagina singola supportano ora l'autorizzazione usando OAuth 2.0. OAuth 2.0 è un framework per autorizzare l'accesso client alle risorse protette. Funziona per un'ampia gamma di client, inclusi browser e dispositivi mobili.

Il supporto per OAuth 2.0 si basa sul nuovo middleware di sicurezza fornito dai componenti OWIN di Microsoft per l'autenticazione del bearer e l'implementazione del ruolo del server di autorizzazione. In alternativa, i client possono essere autorizzati usando un server di autorizzazione dell'organizzazione, ad esempio Azure Active Directory o ADFS in Windows Server 2012 R2.

Miglioramenti di OData

Supporto per $select, $expand, $batch e $value

API Web ASP.NET OData offre ora il supporto completo per $select, $expand e $value. È anche possibile usare $batch per richiedere l'invio in batch e l'elaborazione dei set di modifiche.

Le opzioni $select e $expand consentono di modificare la forma dei dati restituiti da un endpoint OData. Per altre informazioni, vedere Introducing $select and $expand support in Web API OData.

Estendibilità migliorata

I formattatori OData sono ora estendibili. È possibile aggiungere metadati di voce Atom, supportare voci di collegamento di flusso e supporti denominate, aggiungere annotazioni di istanza e personalizzare la modalità di generazione dei collegamenti.

Supporto senza tipi

È ora possibile compilare servizi OData senza dover definire tipi CLR per i tipi di entità. I controller OData possono invece accettare o restituire istanze di IEdmObject, ovvero i formattatori OData serializzano/deserializzare.

Riutilizzare un modello esistente

Se si dispone già di un modello di dati di entità esistente, è ora possibile riutilizzarlo direttamente, anziché crearne uno nuovo. Ad esempio, se si usa Entity Framework, è possibile usare l'EDM compilato automaticamente da EF.

Richiesta di invio in batch

L'invio in batch delle richieste combina più operazioni in una singola richiesta HTTP POST, per ridurre il traffico di rete e offrire un'interfaccia utente più fluida e meno chatta. API Web ASP.NET ora supporta diverse strategie per l'invio in batch delle richieste:

  • Usare l'endpoint $batch di un servizio OData.
  • Creare il pacchetto di più richieste in una singola richiesta multipart MIME.
  • Usare un formato di invio in batch personalizzato.

Per abilitare l'invio in batch delle richieste, è sufficiente aggiungere una route con un gestore di invio in batch alla configurazione dell'API Web:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
        config.Routes.MapHttpBatchRoute( 
            routeName: "WebApiBatch", 
            routeTemplate: "api/batch", 
            batchHandler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer)); 
    } 
}

È anche possibile controllare se le richieste o vengono eseguite in sequenza o in qualsiasi ordine.

Client di API Web ASP.NET portabile

È ora possibile usare il client API Web ASP.NET per creare librerie di classi portabili che funzionano in Windows Store e Windows Phone 8 applicazioni. È anche possibile creare formattatori portabili che possono essere condivisi tra client e server.

Miglioramento della testability

L'API Web 2 semplifica notevolmente lo unit test dei controller API. È sufficiente creare un'istanza del controller API con il messaggio e la configurazione della richiesta e quindi chiamare il metodo di azione da testare. È anche facile simulare la classe UrlHelper , per i metodi di azione che eseguono la generazione di collegamenti.

IHttpActionResult

È ora possibile implementare IHttpActionResult per incapsulare il risultato dei metodi di azione dell'API Web. Un oggetto IHttpActionResult restituito da un metodo di azione dell'API Web viene eseguito dal runtime API Web ASP.NET per produrre il messaggio di risposta risultante. Un oggetto IHttpActionResult può essere restituito da qualsiasi azione API Web per semplificare lo unit test dell'implementazione dell'API Web. Per praticità, vengono fornite diverse implementazioni IHttpActionResult predefinite, inclusi i risultati per la restituzione di codici di stato specifici, contenuto formattato o risposte negoziate con contenuto.

HttpRequestContext

Il nuovo HttpRequestContext tiene traccia di qualsiasi stato associato alla richiesta, ma non immediatamente disponibile dalla richiesta. Ad esempio, è possibile usare HttpRequestContext per ottenere i dati di route, l'entità associata alla richiesta, il certificato client, urlHelper e la radice del percorso virtuale. È possibile creare facilmente un oggetto HttpRequestContext a scopo di unit test.

Poiché l'entità per la richiesta viene propagata con la richiesta anziché basarsi su Thread.CurrentPrincipal, l'entità è ora disponibile per tutta la durata della richiesta mentre si trova nella pipeline dell'API Web.

CORS

Grazie a un altro grande contributo di Brock Allen, ASP.NET ora supporta completamente cross origin request sharing (CORS).

La sicurezza del browser impedisce a una pagina Web di creare richieste AJAX per un altro dominio. CORS è uno standard W3C che consente a un server di ridurre i criteri di stessa origine. Con CORS un server può consentire in modo esplicito alcune richieste multiorigine e rifiutarne altre.

L'API Web 2 supporta ora CORS, inclusa la gestione automatica delle richieste preliminari. Per altre informazioni, vedere Abilitare la condivisione di richieste tra le origini nelle API Web di ASP.NET.

Filtri di autenticazione

I filtri di autenticazione sono un nuovo tipo di filtro in API Web ASP.NET eseguiti prima dei filtri di autorizzazione nella pipeline di API Web ASP.NET e consentono di specificare la logica di autenticazione per azione, per controller o a livello globale per tutti i controller. I filtri di autenticazione elaborano le credenziali nella richiesta e forniscono un'entità corrispondente. I filtri di autenticazione possono anche aggiungere problemi di autenticazione in risposta a richieste non autorizzate.

Sostituzioni filtro

È ora possibile eseguire l'override dei filtri applicati a un determinato metodo di azione o controller specificando un filtro di override. I filtri di override specificano un set di tipi di filtro che non devono essere eseguiti per un determinato ambito (azione o controller). In questo modo è possibile aggiungere filtri globali, ma quindi escludere alcuni da azioni o controller specifici.

Integrazione OWIN

API Web ASP.NET ora supporta completamente OWIN e può essere eseguito in qualsiasi host con supporto OWIN. È incluso anche un HostAuthenticationFilter che fornisce l'integrazione con il sistema di autenticazione OWIN.

Con l'integrazione OWIN, è possibile ospitare autonomamente l'API Web nel proprio processo insieme ad altri middleware OWIN, ad esempio SignalR. Per altre informazioni, vedere Usare OWIN per Self-Host API Web ASP.NET.

ASP.NET SignalR 2.0

Le sezioni seguenti descrivono le funzionalità di SignalR 2.0.

Per un esempio di come aggiornare un progetto 1.x esistente a SignalR 2.0, vedere Aggiornamento di un progetto SignalR 1.x.

Basato su OWIN

SignalR 2.0 è completamente basato su OWIN (Open Web Interface for .NET). Questa modifica rende il processo di configurazione per SignalR molto più coerente tra le applicazioni SignalR ospitate sul Web e self-hosted, ma ha anche richiesto una serie di modifiche all'API.

MapHubs e MapConnection sono ora MapSignalR

Per la compatibilità con gli standard OWIN, questi metodi sono stati rinominati in MapSignalR. MapSignalR chiamato senza parametri eseguirà il mapping di tutti gli hub (come MapHubs nella versione 1.x); per eseguire il mapping di singoli oggetti PersistentConnection , specificare il tipo di connessione come parametro di tipo e l'estensione URL per la connessione come primo argomento.

Il MapSignalR metodo viene chiamato in una classe di avvio Owin. Visual Studio 2013 contiene un nuovo modello per una classe di avvio Owin. Per usare questo modello, eseguire le operazioni seguenti:

  1. Fare clic con il pulsante destro del mouse sul progetto
  2. Selezionare Aggiungi, Nuovo elemento...
  3. Selezionare Classe di avvio Owin. Assegnare alla nuova classe il nome Startup.cs.

In un'applicazione Web, la classe di avvio Owin contenente il MapSignalR metodo viene quindi aggiunta al processo di avvio di Owin usando una voce nel nodo delle impostazioni dell'applicazione del file Web.Config, come illustrato di seguito.

In un'applicazione self-hosted la classe Startup viene passata come parametro di tipo del WebApp.Start metodo .

Mapping di hub e connessioni in SignalR 1.x (dal file dell'applicazione globale in un'applicazione Web):

protected void Application_Start(object sender, EventArgs e) 
{
    // Map all hubs to "/signalr"
    RouteTable.Routes.MapHubs();
    // Map the Echo PersistentConnection to "/echo"
    RouteTable.Routes.MapConnection<myconnection>("echo", "/echo");
}

Mapping di hub e connessioni in SignalR 2.0 (da un file di classe Owin Startup):

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Map all hubs to "/signalr"
            app.MapSignalR();
            // Map the Echo PersistentConnection to "/echo"
            app.MapSignalR<echoconnection>("/echo");
        }
    }
}

In un'applicazione self-hosted la classe Startup viene passata come parametro di tipo per il WebApp.Start metodo , come illustrato di seguito.

string url = "http://localhost:8080";
using (WebApp.Start<startup>(url))
{
    Console.WriteLine("Server running on {0}", url);
    Console.ReadLine();
}

Supporto tra domini

In SignalR 1.x le richieste tra domini sono state controllate da un singolo flag EnableCrossDomain. Questo flag controlla le richieste JSONP e CORS. Per una maggiore flessibilità, tutto il supporto CORS è stato rimosso dal componente server di SignalR (i client JavaScript usano comunque CORS normalmente se viene rilevato che il browser lo supporta) e sono stati resi disponibili nuovi middleware OWIN per supportare questi scenari.

In SignalR 2.0, se JSONP è necessario nel client (per supportare le richieste tra domini nei browser meno recenti), sarà necessario abilitarlo in modo esplicito impostando EnableJSONP sull'oggetto HubConfiguration su true, come illustrato di seguito. JSONP è disabilitato per impostazione predefinita, perché è meno sicuro di CORS.

Per aggiungere il nuovo middleware CORS in SignalR 2.0, aggiungere la Microsoft.Owin.Cors libreria al progetto e chiamare UseCors prima del middleware SignalR, come illustrato nella sezione seguente.

Aggiunta di Microsoft.Owin.Cors al progetto: per installare questa libreria, eseguire il comando seguente nella console di Gestione pacchetti:

Install-Package Microsoft.Owin.Cors

Questo comando aggiungerà la versione 2.0.0 del pacchetto al progetto.

Chiamata di UseCors

I frammenti di codice seguenti illustrano come implementare connessioni tra domini in SignalR 1.x e 2.0.

Implementazione di richieste tra domini in SignalR 1.x (dal file dell'applicazione globale)

protected void Application_Start(object sender, EventArgs e) 
{
    var hubConfiguration = new HubConfiguration();
    hubConfiguration.EnableCrossDomain = true;
    RouteTable.Routes.MapHubs(hubConfiguration);
}

Implementazione di richieste tra domini in SignalR 2.0 (da un file di codice C#)

Il codice seguente illustra come abilitare CORS o JSONP in un progetto SignalR 2.0. Questo esempio di codice usa Map e RunSignalR invece di MapSignalR, in modo che il middleware CORS venga eseguito solo per le richieste SignalR che richiedono il supporto CORS (anziché per tutto il traffico nel percorso specificato in MapSignalR.) Map può essere usato anche per qualsiasi altro middleware che deve essere eseguito per un prefisso URL specifico, anziché per l'intera applicazione.

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Branch the pipeline here for requests that start with "/signalr"
            app.Map("/signalr", map =>
            {
                // Setup the CORS middleware to run before SignalR.
                // By default this will allow all origins. You can 
                // configure the set of origins and/or http verbs by
                // providing a cors options with a different policy.
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration 
                {
                    // You can enable JSONP by uncommenting line below.
                    // JSONP requests are insecure but some older browsers (and some
                    // versions of IE) require JSONP to work cross domain
                    // EnableJSONP = true
                };
                // Run the SignalR pipeline. We're not using MapSignalR
                // since this branch already runs under the "/signalr"
                // path.
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

Supporto per iOS e Android tramite MonoTouch e MonoDroid

È stato aggiunto il supporto per i client iOS e Android usando componenti MonoTouch e MonoDroid dalla libreria Xamarin. Per altre informazioni su come usarle, vedere Uso di componenti Xamarin. Questi componenti saranno disponibili in Xamarin Store quando è disponibile la versione SignalR RTW.

Client .NET portabile ###

Per semplificare meglio lo sviluppo multipiattaforma, i client Silverlight, WinRT e Windows Phone sono stati sostituiti con un singolo client .NET portatile che supporta le piattaforme seguenti:

  • NET 4.5
  • Silverlight 5
  • WinRT (.NET per le app di Windows Store)
  • Windows Phone 8

Nuovo pacchetto Self-Host

È ora disponibile un pacchetto NuGet per semplificare l'introduzione a SignalR Self-Host (applicazioni SignalR ospitate in un processo o in un'altra applicazione, anziché ospitate in un server Web). Per aggiornare un progetto self-host compilato con SignalR 1.x, rimuovere il pacchetto Microsoft.AspNet.SignalR.Owin e aggiungere il pacchetto Microsoft.AspNet.SignalR.SelfHost. Per altre informazioni su come iniziare a usare il pacchetto self-host, vedere Esercitazione: Self-host SignalR.

Supporto del server compatibile con le versioni precedenti

Nelle versioni precedenti di SignalR, le versioni del pacchetto SignalR usate nel client e nel server devono essere identiche. Per supportare applicazioni thick client difficili da aggiornare, SignalR 2.0 ora supporta l'uso di una versione più recente del server con un client precedente. Nota: SignalR 2.0 non supporta i server compilati con versioni precedenti con client più recenti.

Rimozione del supporto del server per .NET 4.0

SignalR 2.0 ha eliminato il supporto per l'interoperabilità del server con .NET 4.0. .NET 4.5 deve essere usato con i server SignalR 2.0. Esiste ancora un client .NET 4.0 per SignalR 2.0.

Invio di un messaggio a un elenco di client e gruppi

In SignalR 2.0 è possibile inviare un messaggio usando un elenco di ID client e gruppo. I frammenti di codice seguenti illustrano come eseguire questa operazione.

Invio di un messaggio a un elenco di client e gruppi tramite PersistentConnection

using Microsoft.AspNet.SignalR;
using System.Collections.Generic;
public class ChatConnection : PersistentConnection
{
    static List<string> ConnectionIds = new List<string>();
    static List<string> groups = new List<string>{"chatGroup", "chatGroup2"};
    protected override System.Threading.Tasks.Task OnReceived(IRequest request, string connectionId, string data)
    {
        Connection.Send(ConnectionIds, data);
        Groups.Send(groups, data);
        return base.OnReceived(request, connectionId, data);
    }
    protected override System.Threading.Tasks.Task OnConnected(IRequest request, string connectionId)
    {
        ConnectionIds.Add(connectionId);
        Groups.Add(connectionId, "chatGroup");
        return base.OnConnected(request, connectionId);
    }
    protected override System.Threading.Tasks.Task OnDisconnected(IRequest request, string connectionId)
    {
        ConnectionIds.Remove(connectionId);
        return base.OnDisconnected(request, connectionId);
    }
}

Invio di un messaggio a un elenco di client e gruppi tramite Hub

using Microsoft.AspNet.SignalR;
using System.Collections.Generic;
public class ChatHub : Hub
{
    static List<string> ConnectionIds = new List<string>();
    static List<string> groups = new List<string> { "chatGroup", "chatGroup2" };
    public void Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients.
        Clients.Clients(ConnectionIds).broadcastMessage(name, message);
        Clients.Groups(groups).broadcastMessage(name, message);
    }
    public override System.Threading.Tasks.Task OnConnected()
    {
        ConnectionIds.Add(Context.ConnectionId);
        Groups.Add(Context.ConnectionId, "chatGroup");
        return base.OnConnected();
    }
    public override System.Threading.Tasks.Task OnDisconnected()
    {
        ConnectionIds.Remove(Context.ConnectionId);
        return base.OnDisconnected();
    }
}

Invio di un messaggio a un utente specifico

Questa funzionalità consente agli utenti di specificare il valore userId basato su un IRequest tramite una nuova interfaccia IUserIdProvider:

Interfaccia IUserIdProvider

public interface IUserIdProvider
{
    string GetUserId(IRequest request);
}

Per impostazione predefinita, sarà presente un'implementazione che usa il IPrincipal.Identity.Name dell'utente come nome utente.

Negli hub sarà possibile inviare messaggi a questi utenti tramite una nuova API:

Uso dell'API Clients.User

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}

Supporto migliore per la gestione degli errori

Gli utenti possono ora generare HubException da qualsiasi chiamata dell'hub. Il costruttore di HubException può accettare un messaggio stringa e un oggetto dati di errore aggiuntivi. SignalR serializzerà automaticamente l'eccezione e la invierà al client in cui verrà usata per rifiutare/non riuscire la chiamata al metodo hub.

L'impostazione mostra eccezioni dell'hub dettagliate non ha alcun effetto sull'hubException inviato al client o meno; viene sempre inviato.

Codice lato server che illustra l'invio di un hubException al client

public class MyHub : Hub
{
    public void Send(string message)
    {
        if(message.Contains("<script>"))
        {
            throw new HubException("This message will flow to the client", new { user = Context.User.Identity.Name, message = message });
        }

        Clients.All.send(message);
    }
}

Codice client JavaScript che illustra la risposta a un hubException inviato dal server

myHub.server.send("<script>")
            .fail(function (e) {
                if (e.source === 'HubException') {
                    console.log(e.message + ' : ' + e.data.user);
                }
            });

Codice client .NET che illustra la risposta a un hubException inviato dal server

try
{
    await myHub.Invoke("Send", "<script>");
}
catch(HubException ex)
{
    Conosle.WriteLine(ex.Message);
}

Più semplice unit test degli hub

SignalR 2.0 include un'interfaccia denominata IHubCallerConnectionContext in Hub che semplifica la creazione di chiamate sul lato client fittizie. I frammenti di codice seguenti illustrano l'uso di questa interfaccia con i test più diffusi xUnit.net e moq.

Unit test SignalR con xUnit.net

[Fact]
public void HubsAreMockableViaDynamic()
{
    bool sendCalled = false;
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    hub.Clients = mockClients.Object;
    dynamic all = new ExpandoObject();
    all.send = new Action<string>(message =>
    {
        sendCalled = true;
    });
    mockClients.Setup(m => m.All).Returns((ExpandoObject)all);
    hub.Send("foo");
    Assert.True(sendCalled);
}

Unit testing SignalR con moq

[Fact]
public interface IClientContract
{
    void send(string message);
}
public void HubsAreMockableViaType()
{
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    var all = new Mock<IClientContract>();
    hub.Clients = mockClients.Object;
    all.Setup(m => m.send(It.IsAny<string>())).Verifiable();
    mockClients.Setup(m => m.All).Returns(all.Object);
    hub.Send("foo");
    all.VerifyAll();

Gestione degli errori JavaScript

In SignalR 2.0 tutti gli errori JavaScript che gestiscono i callback restituiscono oggetti errore JavaScript anziché stringhe non elaborate. Ciò consente a SignalR di scorrere informazioni più complete ai gestori degli errori. È possibile ottenere l'eccezione interna dalla source proprietà dell'errore.

Codice client JavaScript che gestisce l'eccezione Start.Fail

connection.start().fail(function(e) {
    console.log('The error is: ' + e.message);
});

Identità ASP.NET

Nuovo sistema di appartenenza ASP.NET

ASP.NET Identity è il nuovo sistema di appartenenza per le applicazioni di ASP.NET. ASP.NET Identity semplifica l'integrazione dei dati del profilo specifici dell'utente con i dati dell'applicazione. ASP.NET Identity consente anche di scegliere il modello di persistenza per i profili utente nell'applicazione. È possibile archiviare i dati in un database SQL Server o in un altro archivio dati, inclusi gli archivi dati NoSQL , come ad esempio le tabelle di Archiviazione di Azure. Per altre informazioni, vedere Account utente singoliin Creazione di progetti Web ASP.NET in Visual Studio 2013.

Autenticazione basata sulle attestazioni

ASP.NET ora supporta l'autenticazione basata sulle attestazioni, in cui l'identità dell'utente è rappresentata come set di attestazioni da un'autorità di certificazione attendibile. Gli utenti possono essere autenticati usando un nome utente e una password gestiti in un database dell'applicazione o usando provider di identità social (ad esempio: Account Microsoft, Facebook, Google, Twitter) o usando account aziendali tramite Azure Active Directory o Active Directory Federation Services (ADFS).

Integrazione con Azure Active Directory e Windows Server Active Directory

È ora possibile creare progetti ASP.NET che usano Azure Active Directory o Windows Server Active Directory (AD) per l'autenticazione. Per altre informazioni, vedere Account organizzativi in Creazione di progetti Web ASP.NET in Visual Studio 2013.

Integrazione OWIN

ASP.NET'autenticazione è ora basata sul middleware OWIN che può essere usato in qualsiasi host basato su OWIN. Per altre informazioni su OWIN, vedere la sezione Microsoft OWIN Components seguente.

Componenti Microsoft OWIN

Open Web Interface for .NET (OWIN) definisce un'astrazione tra i server Web .NET e le applicazioni Web. OWIN separa l'applicazione Web dal server, rendendo le applicazioni Web host-agnostic. Ad esempio, è possibile ospitare un'applicazione Web basata su OWIN in IIS o self-host in un processo personalizzato.

Le modifiche introdotte nei componenti microsoft OWIN (noto anche come progetto Katana) includono nuovi componenti server e host, nuove librerie helper e middleware e nuovo middleware di autenticazione.

Per altre informazioni su OWIN e Katana, vedere Novità di OWIN e Katana.

Nota: le applicazioni OWIN non possono essere eseguite in modalità classica IIS; devono essere eseguiti in modalità integrata.

Nota: le applicazioni OWIN devono essere eseguite con attendibilità completa.

Nuovi server e host

Con questa versione sono stati aggiunti nuovi componenti per abilitare scenari self-host. Questi componenti includono i pacchetti NuGet seguenti:

  • Microsoft.Owin.Host.HttpListener. Fornisce un server OWIN che usa HttpListener per ascoltare le richieste HTTP e indirizzarle nella pipeline OWIN.
  • Microsoft.Owin.Hosting fornisce una libreria per gli sviluppatori che desiderano ospitare una pipeline OWIN in un processo personalizzato, ad esempio un'applicazione console o un servizio Windows.
  • OwinHost. Fornisce un eseguibile autonomo che esegue il wrapping Microsoft.Owin.Hosting e consente di ospitare una pipeline OWIN senza dover scrivere un'applicazione host personalizzata.

Inoltre, il pacchetto consente al middleware di fornire hint al server SystemWeb, che indica che il Microsoft.Owin.Host.SystemWeb middleware deve essere chiamato durante una fase specifica della pipeline di ASP.NET. Questa funzionalità è particolarmente utile per il middleware di autenticazione, che deve essere eseguito all'inizio della pipeline di ASP.NET.

Librerie helper e middleware

Anche se è possibile scrivere componenti OWIN usando solo le definizioni di funzione e di tipo dalla specifica OWIN, il nuovo Microsoft.Owin pacchetto offre un set più descrittivo di astrazioni. Questo pacchetto combina diversi pacchetti precedenti (ad esempio , Owin.Extensions, Owin.Types) in un singolo modello a oggetti ben strutturato che può essere quindi facilmente usato da altri componenti OWIN. Infatti, la maggior parte dei componenti Microsoft OWIN ora usa questo pacchetto.

Nota

Le applicazioni OWIN non possono essere eseguite in modalità classica IIS; devono essere eseguiti in modalità integrata.

Nota

Le applicazioni OWIN devono essere eseguite con attendibilità completa.

Questa versione include anche il pacchetto Microsoft.Owin.Diagnostics, che include middleware per convalidare un'applicazione OWIN in esecuzione, oltre al middleware della pagina degli errori per analizzare gli errori.

Componenti di autenticazione

Sono disponibili i componenti di autenticazione seguenti.

  • Microsoft.Owin.Security.ActiveDirectory. Abilita l'autenticazione usando servizi directory locali o basati sul cloud.
  • Microsoft.Owin.Security.Cookies Abilita l'autenticazione usando i cookie. Questo pacchetto è stato precedentemente denominato Microsoft.Owin.Security.Forms.
  • Microsoft.Owin.Security.Facebook Abilita l'autenticazione usando il servizio basato su OAuth di Facebook.
  • Microsoft.Owin.Security.Google Abilita l'autenticazione usando il servizio basato su OpenID di Google.
  • Microsoft.Owin.Security.Jwt Abilita l'autenticazione usando i token JWT.
  • Microsoft.Owin.Security.MicrosoftAccount Abilita l'autenticazione usando gli account Microsoft.
  • Microsoft.Owin.Security.OAuth. Fornisce un server di autorizzazione OAuth e il middleware per l'autenticazione dei token di connessione.
  • Microsoft.Owin.Security.Twitter Abilita l'autenticazione usando il servizio basato su OAuth di Twitter.

Questa versione include anche il pacchetto, che contiene middleware per l'elaborazione Microsoft.Owin.Cors di richieste HTTP tra origini.

Nota

Il supporto per la firma JWT è stato rimosso nella versione finale di Visual Studio 2013.

Entity Framework 6

Per un elenco di nuove funzionalità e altre modifiche in Entity Framework 6, vedere Cronologia delle versioni di Entity Framework.

ASP.NET Razor 3

ASP.NET Razor 3 include le nuove funzionalità seguenti:

  • Supporto per la modifica della scheda. In precedenza, il comando Format document , il rientro automatico e la formattazione automatica in Visual Studio non funzionavano correttamente quando si usa l'opzione Mantieni schede . Questa modifica corregge la formattazione di Visual Studio per il codice Razor per la formattazione della scheda.
  • Supporto per le regole di riscrittura URL durante la generazione di collegamenti.
  • Rimozione dell'attributo trasparente per la sicurezza.

    Nota

    Questa è una modifica di rilievo e rende Razor 3 incompatibile con MVC4 e versioni precedenti, mentre Razor 2 è incompatibile con MVC5 o assembly compilati su MVC5.

=======

sospensione dell'app ASP.NET

ASP.NET App Suspend è una funzionalità che cambia gioco in .NET Framework 4.5.1 che modifica radicalmente l'esperienza utente e il modello economico per ospitare un numero elevato di siti ASP.NET in un singolo computer. Per altre informazioni, vedere ASP.NET Hosting Web .NET condiviso reattivo.

Problemi noti e modifiche di rilievo

Questa sezione descrive i problemi noti e le modifiche di rilievo nei ASP.NET and Web Tools per Visual Studio 2013.

NuGet

  • Il nuovo ripristino del pacchetto non funziona su Mono quando si usa il file SLN: verrà risolto in un prossimo nuget.exe download e aggiornamento del pacchetto NuGet.CommandLine .
  • Il nuovo ripristino del pacchetto non funziona con i progetti Wix: verrà risolto in un prossimo nuget.exe download e aggiornamento del pacchetto NuGet.CommandLine .

API Web ASP.NET

  1. ODataQueryOptions<T>.ApplyTo(IQueryable) non restituisce IQueryable<T> sempre, poiché è stato aggiunto il supporto per $select e $expand.

    Gli esempi precedenti per ODataQueryOptions<T> eseguire sempre il cast del valore restituito da ApplyTo a IQueryable<T>. Questa operazione è stata eseguita in precedenza perché le opzioni di query supportate in precedenza ($filter, , $orderby$skip, $top) non modificano la forma della query. Ora che è supportato $select e $expand il valore restituito da ApplyTo non sarà IQueryable<T> sempre.

    // Sample ODataQueryOptions<T> usage from earlier
    public IQueryable<Customer> Get(ODataQueryOptions<Customer> query)
    {
        IQueryable<customer> result="query.ApplyTo(_customers)" as iqueryable<customer>; return result;
    }
    

    Se si usa il codice di esempio da prima, continuerà a funzionare se il client non invia $select e $expand. Tuttavia, se si vuole supportare $select e $expand si deve modificare il codice in questo modo.

    public IHttpActionResult Get(ODataQueryOptions<Customer> query)
    {
        IQueryable result = query.ApplyTo(_customers);
        return Ok(result, result.GetType());
    }
     
    private IHttpActionResult Ok(object content, Type type)
    {
        Type resultType = typeof(OkNegotiatedContentResult<>).MakeGenericType(type);
        return Activator.CreateInstance(resultType, content, this) as IHttpActionResult;
    }
    
  2. Request.Url o RequestContext.Url è Null durante una richiesta batch

    In uno scenario di batch UrlHelper è null quando si accede da Request.Url o RequestContext.Url.

    La soluzione alternativa per questo problema consiste nel creare una nuova istanza di UrlHelper, come nell'esempio seguente:

    Creazione di una nuova istanza di UrlHelper

    if (RequestContext.Url == null)
    {
        RequestContext.Url = new UrlHelper(Request);
    }
    

ASP.NET MVC

  1. Quando si usa MVC5 e OrgAuth, se si dispone di visualizzazioni che eseguono la convalida AntiForgerToken, potrebbe verificarsi l'errore seguente quando si pubblicano i dati nella visualizzazione:

    Errore:

    Errore del server nell'applicazione '/'.

    Attestazione di tipo http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier o https://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider non presente nell'oggetto ClaimsIdentity specificato. Per abilitare il supporto del token anti-forgery con l'autenticazione basata su attestazioni, verificare che il provider di attestazioni configurato fornisca entrambe queste attestazioni nelle istanze claimsIdentity generate. Se il provider di attestazioni configurato usa invece un tipo di attestazione diverso come identificatore univoco, può essere configurato impostando la proprietà statica AntiForgeryConfig.UniqueClaimTypeIdentifier.

    Soluzione alternativa:

    Aggiungere la riga seguente in Global.asax per correggerla:

    AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.Name;

    Verrà risolto per la versione successiva.

  2. Dopo aver aggiornato un'app MVC4 a MVC5, compilare la soluzione e avviarla. Verrà visualizzato l'errore seguente:

    [A] System.Web.WebPages.Razor.Configuration.HostSection non può essere eseguito il cast su [B]System.Web.WebPages.Razor.Configuration.HostSection. Il tipo A proviene da 'System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf38565ad364e35' nel contesto 'Default' nella posizione 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'. Il tipo B proviene da 'System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf385656ad364e35' nel contesto 'Default' nel contesto 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\6d05bbd0\e8b5908e\assembly\dl3\c9cbca63\f8910382_6273ce01\System.Web.WebPages.Razor.dll'.

    Per correggere l'errore precedente, aprire tutti i file di Web.config (inclusi quelli nella cartella Visualizzazioni) nel progetto ed eseguire le operazioni seguenti:

    1. Aggiornare tutte le occorrenze della versione "4.0.0.0" di "System.Web.Mvc" a "5.0.0.0".

    2. Aggiornare tutte le occorrenze della versione "2.0.0.0" di "System.Web.Helpers", "System.Web.WebPages" e "System.Web.WebPages.Razor" su "3.0.0.0.0"

      Ad esempio, dopo aver apportato le modifiche precedenti, le associazioni di assembly dovrebbero essere simili al seguente:

      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      

      Per informazioni sull'aggiornamento dei progetti MVC 4 a MVC 5, vedere How to Upgrade an ASP.NET MVC 4 and Web API Project to ASP.NET MVC 5 and Web API 2.

  3. Quando si usa la convalida lato client con jQuery Unobtrusive Validation, il messaggio di convalida a volte non è corretto per un elemento di input HTML con type='number'. L'errore di convalida per un valore obbligatorio ("Il campo Age è obbligatorio") viene visualizzato quando viene immesso un numero non valido anziché il messaggio corretto richiesto da un numero valido.

    Questo problema viene comunemente trovato con codice scaffolded per un modello con una proprietà integer nelle visualizzazioni Crea e Modifica.

    Per risolvere questo problema, modificare l'helper dell'editor da:

    @Html.EditorFor(person => person.Age)

    Con:

    @Html.TextBoxFor(person => person.Age)

  4. ASP.NET MVC 5 non supporta più l'attendibilità parziale. I progetti che si collegano ai file binari MVC o WebAPI devono rimuovere l'attributo SecurityTransparent e l'attributo AllowPartiallyTrustedCallers . La rimozione di questi attributi elimina gli errori del compilatore, ad esempio quanto segue.

    Attempt by security transparent method ‘MyComponent' to access security critical type 'System.Web.Mvc.MvcHtmlString' failed. Assembly 'PagedList.Mvc, Version=4.3.0.0, Culture=neutral, PublicKeyToken=abbb863e9397c5e1' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model. Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.

    Nota, come effetto collaterale di questo non è possibile usare assembly 4.0 e 5.0 nella stessa applicazione. È necessario aggiornarli a 5.0.

Il modello SPA con autorizzazione Facebook può causare instabilità in Internet Explorer mentre il sito Web è ospitato nell'area Intranet

Il modello SPA fornisce l'accesso esterno con Facebook. Quando il progetto creato con il modello è in esecuzione in locale, l'accesso può causare l'arresto anomalo dell'ambiente di internet explorer.

Soluzione:

  1. Ospitare il sito Web nell'area Internet; O

  2. Testare lo scenario in un browser diverso da Internet Explorer.

Web Forms Scaffolding

Web Forms Scaffolding è stato rimosso da VS2013 e sarà disponibile in un aggiornamento futuro a Visual Studio. Tuttavia, è comunque possibile usare scaffolding all'interno di un progetto Web Forms aggiungendo dipendenze MVC e generando scaffolding per MVC. Il progetto conterrà una combinazione di Web Forms e MVC.

Per aggiungere MVC al progetto Web Forms, aggiungere un nuovo elemento scaffolded e selezionare Dipendenze MVC 5. Selezionare Minimal o Full a seconda che siano necessari tutti i file di contenuto, ad esempio gli script. Aggiungere quindi un elemento scaffolded per MVC, che creerà viste e un controller nel progetto.

Scaffolding di MVC e API Web - HTTP 404, Errore non trovato

Se si verifica un errore quando si aggiunge un elemento scaffolded a un progetto, è possibile che il progetto venga lasciato in uno stato incoerente. Alcune delle modifiche apportate verranno rollback, ma altre modifiche, ad esempio i pacchetti NuGet installati, non verranno eseguito il rollback. Se le modifiche alla configurazione di routing vengono rollback, gli utenti riceveranno un errore HTTP 404 quando si passa agli elementi scaffolded.

Soluzione alternativa:

  • Per correggere questo errore per MVC, aggiungere un nuovo elemento scaffolded e selezionare Dipendenze MVC 5 (minimo o completo). Questo processo aggiungerà tutte le modifiche necessarie al progetto.

  • Per correggere questo errore per l'API Web:

    1. Aggiungere la classe WebApiConfig al progetto.

      public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
              config.MapHttpAttributeRoutes();
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
          }
      }
      
      Public Module WebApiConfig
          Public Sub Register(ByVal config As HttpConfiguration)
              config.MapHttpAttributeRoutes()
              config.Routes.MapHttpRoute(
                name:="DefaultApi",
                routeTemplate:="api/{controller}/{id}",
                defaults:=New With {.id = RouteParameter.Optional}
              )
          End Sub
      End Module
      
    2. Configurare WebApiConfig.Register nel metodo Application_Start in Global.asax come indicato di seguito:

      public class WebApiApplication : System.Web.HttpApplication
      {
          protected void Application_Start()
          {
              GlobalConfiguration.Configure(WebApiConfig.Register);    
          }
      }
      
      Public Class WebApiApplication
           Inherits System.Web.HttpApplication
       
           Sub Application_Start()     
             GlobalConfiguration.Configure(AddressOf WebApiConfig.Register)       
           End Sub
      End Class