2017-11-14 2 views
1

Ich habe einen Server, den ich eingerichtet habe, läuft in der Produktion, wir haben Tonnen von Anwendungen, die diesen Webserver aufrufen. Der folgende Code soll demonstrieren, dass er jegliche Ursprungsanforderungen zulässt.AllowAnyOrigin Cors Nicht funktioniert Axios Vuejs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseExceptionHandler("/Home/Error"); 

     app.UseStaticFiles(); 

     app.UseCors(builder => 
     { 
      builder.AllowAnyOrigin() 
        .AllowAnyMethod() 
        .AllowAnyHeader(); 
     }); 

Dies funktioniert für alle derzeit eingerichteten Server. Es befindet sich in unserem internen Netzwerk und andere Server werden diesen Dienst intern nutzen.

Ich erstelle einen Proof of Concept, um zu versuchen, unsere Anwendungen langsam zu modernisieren, indem wir Vue verwenden. Außer dieser axios Anfrage wird ein Fehler angezeigt. Die anderen Server, die diese Methode aufrufen, verwenden ebenfalls .net, aber sie sollten dieselbe Anfrage erstellen.

Hier ist der Fehler.

Fehler beim Laden von https: // {Server}/api/application/36626: Auf der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Ursprung 'http://localhost:8080' ist daher nicht erlaubt.

Dies ist offensichtlich verrückt reden von axios. Ich lasse jeden Ursprung zu. Ich kann mir nicht vorstellen, dass wir nur "einfache Anfragen" verwenden wollen, damit der w3-Standard für einfache Anfragen nicht funktioniert. Ich dachte, das könnte ein falscher Fehler sein, wenn man bedenkt, dass es sich um einen Server handelt. Der Code ist unten.

<script> 
import axios from 'axios' 

export default { 
    name: 'AppList', 
    data() { 
    return { 
     applist: [], 
     errors: [] 
    } 
    }, 
    created: function() { 
    axios.get('https://{server}/api/application/36626') 
     .then(r => { console.log(response); }) 
     .catch(ex => { 
     this.errors.push(ex); 
     }) 
    } 
} 
</script> 

EDIT Ich habe volle Rechte an dieser Maschine habe ich bestätigt ich ohne Probleme ein Postbote GET Anfrage von meinem lokalen Rechner verwenden können.

Edit 2 Arbeiten curl Befehl curl -X GET --header 'Accept: application/octet-stream' 'https://{server}/api/Application/36626'

+0

Versuchen Sie Ihren Server mit https://www.test-cors.org/ – akatakritos

+0

@akatakritos es auf unserem internen Netzwerk ist, ist außerhalb unserer Netzwerk nicht verfügbar. –

+0

Es macht eine Anfrage von Ihrem Browser, so dass Sie immer noch in der Lage sein, es zu treffen – akatakritos

Antwort

1

Es stellt sich die .Net Core Server aus wurde richtig nicht festgelegt, war es nicht, bis ich den Browser auf meinem lokalen Rechner zu verwenden versuchte, tat das CORS Problem auftauchen.

Ich bin mir nicht sicher, ob sich die CORS-Implementierung geändert hat und mir nicht bewusst war oder ob ich es nicht von Anfang an getan habe, aber ich war mir sicher, dass ich den Leitfäden gefolgt bin.

Das erste, was ich geändert habe, war sicherzustellen, dass die Cors-Richtlinie hinzugefügt wurde, bevor Sie die App so konfigurieren, dass sie MVC verwendet.

Die zweite Sache, die ich getan habe, und ich vermute, das ist optional, aber bewährte Praxis, ich habe auch die Policy-Logik auf die ConfigureServices Methode verschoben.

Mein endgültiger Code sah unten aus. Ich behalte so viel Takt, um die Ordnung zu bewahren.

public void ConfigureServices(IServiceCollection services) 
     { 
      // Add framework services. 
      services.AddCors(options => 
      { 
       options.AddPolicy("CorsPolicy", 
        builder => builder.AllowAnyOrigin() 
        .AllowAnyMethod() 
        .AllowAnyHeader() 
        .AllowCredentials()); 
      }); 
      services.AddOptions(); 
      services.AddSwaggerGen(); 
      ///Authentication configuration went here. 
      services.AddSingleton<IConfiguration>(Configuration); 
      services.AddMvc(); 

     } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     app.UseExceptionHandler("/Home/Error"); 
     app.UseStaticFiles(); 
     app.UseCors("CorsPolicy"); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 

     app.UseSwagger((httpRequest, swaggerDoc) => 
     { 
      swaggerDoc.Host = httpRequest.Host.Value; 

     }); 
     app.UseSwaggerUi(swaggerUrl: "/{appname}/swagger/v1/swagger.json");