c# - SignalR CORS su Web API di Servizi mobili di Azure



asp.net azure-mobile-services (2)

Possiedo un servizio mobile di Azure che esegue Web Api e c # e abilitato CORS come suggerito in Abilita CORS su Serivce .NET Backend di Azure Mobile, tuttavia ora sono giunto ad aggiungere SignalR al mix.

SignalR sta funzionando bene ma non riesco a vedere per trovare come abilitare CORS.

Al momento nella mia app di test di prova ho il seguente:

//enable CORS for WebAPI
var cors = new EnableCorsAttribute("*", "*", "*");
httpconfig.EnableCors(cors);
//rather than use the static method new up SignalRExtensionConfig and pass the current config, hopefully allowing CORS...
var signalRConfig = new SignalRExtensionConfig();
signalRConfig.Initialize(httpconfig, ioc);

Ma CORS non funziona per i mozzi SignalR, funziona solo per WebAPI :( Ho la sensazione frustrante:

Nessuna intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. L'origine 'null' non è quindi consentita l'accesso.

Ho controllato le intestazioni di risposta e posso confermare che non viene inviato nulla.

Qualcuno può consigliare?

https://ffff65535.com


Ho trovato un modo per abilitare CORS per SignalR ma non sembra il modo "corretto". Ma basta giocare con lo sviluppo fino a quando non avrò notizie dai nostri amici dei servizi mobili.

Il pacchetto NuGet SignalR di Azure Mobile Services contiene una classe OwinAppBuilderExtension. Questa classe viene utilizzata durante l'avvio per estendere l'installazione di Owin per signalr. Ho quindi sottoclassato questo e sovrascritto il metodo ConfigureSignalR.

All'interno di questo metodo puoi accedere a IAppBuilder. Una volta qui ho semplicemente aggiunto appBuilder.UseCors (CorsOptions.AllowAll); prima di base.ConfigureSignalR (appBuilder);

Ora questo è tutt'altro che ideale in quanto ho abilitato CORS per tutto e ho detto di consentire a tutti. Ma per i test di sviluppo questo è OK e fornirò una politica CORS personalizzata in qualsiasi momento.

Il passaggio finale consiste nell'impostare la nuova sottoclasse (CORSSignalROwinAppBuilderExtension) che verrà utilizzata dal nostro servizio.

All'interno della configurazione di HttpConfig

 var configBuilder = new ConfigBuilder(options, (httpconfig, ioc) =>
 {
       ioc.RegisterInstance(new CORSSignalROwinAppBuilderExtension(httpconfig)).As<IOwinAppBuilderExtension>();
 });

Spero che questo ti aiuti


Sto usando il codice qui sotto per aggiungere CORS a SignalR nel mio progetto WebAPI. Ma non è in esecuzione all'interno del servizio mobile. Non sono sicuro se questo aiuta.

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            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
                        EnableJavaScriptProxies = false
                    };
                    // Run the SignalR pipeline. We're not using MapSignalR
                    // since this branch already runs under the "/signalr" path.
                    map.RunSignalR(hubConfiguration);
                });
        }
    }

Incollato come risposta in quanto non contiene codici multilinea nel commento. Si prega di ignorare se non aiuta.





azure-mobile-services