2017-08-13 37 views
5

Używam aplikacji Angular 4 z interfejsem API ASP, które testuję na locahost z różnymi portami. Moja WebApi wymaga uwierzytelniania systemu Windows (trzeba uzyskać nazwę użytkownika logowania). Wszystkie połączenia korzystające z GET działają, ale niestety nie mogę uruchomić testu POST. Mam konfiguracji WebAPI dla CORS:Asp.net Core CORS działa z GET, ale nie z POST

 public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 
     services.AddDbContext<CatalogContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
     services.AddCors(options => 
     { 
      options.AddPolicy("AllowAll", builder => 
      { 
       builder.AllowAnyOrigin() 
        .AllowAnyHeader() 
        .AllowAnyMethod() 
        .AllowCredentials(); 
      }); 

     }); 
     services.AddMvc(); 
    } 

i kątowe 4 klient próbuje odpowiedzieć plikowi

fileChange(event) { 
let fileList: FileList = event.target.files; 
if (fileList.length > 0) { 
    let file: File = fileList[0]; 
    let formData: FormData = new FormData(); 
    formData.append('uploadFile', file, file.name); 
    let headers = new Headers(); 
    /** No need to include Content-Type in Angular 4 */ 
    headers.append('Content-Type', 'multipart/form-data'); 
    headers.append('Accept', 'application/json'); 

    let options = new RequestOptions({ headers: headers, withCredentials: true }); 
    this.http.post("http://localhost:495/api//upload",formData, options) 
    .map(res => res.json()) 
    .catch(error => Observable.throw(error)) 
    .subscribe(
    data => console.log('success'), 
    error => console.log(error) 
    ) 
} 

Mój błąd:

XMLHttpRequest nie może załadować http://localhost:495/api//upload. Na żądanym zasobie nie ma nagłówka "Access-Control-Allow-Origin". Pochodzenie "http://localhost:4200" jest zatem niedozwolone. Odpowiedź miała kod stanu HTTP 500

i nagłówki Odpowiedź

Content-Length: 0 Data: Sun, 13 sierpnia 2017 13:13:09 GMT Persistent-Auth: true Serwer: Kestrel X parowe-by: ASP.NET X-SourceFiles: = UTF-8 B QzpcU291cmNlIENvZGVcUGFydG5lcnNoaXBDYXRhbG9nXFBhcnRuZXJzaGlwQ2F0YWxvZ1xQYXJ0bmVyc2hpcENhdGFsb2cuV2ViQXBpXGFwaVx1cGxvYWQ = =

Każda pomoc będzie mile widziane??!

+0

Sprawdź http://enable-cors.org. wygląda na to, że sposób dodawania corsa nie działa. Sprawdź kartę sieci chrome dla żądania http. Kliknij na żądanie indywidualnie, aby zobaczyć szczegóły dotyczące żądania i odpowiedzi. Zamiast dzwonić za pośrednictwem aplikacji, sprawdź za pomocą rozszerzeń fiddler lub chrome, takich jak listonosz lub zaawansowany wypoczynek. Możesz również spróbować osobno włączyć cors dla poszczególnych klas, metod lub w web.config. – Amit

+2

Proszę opublikuj swój stos wyjątków/wiadomość. Kiedy wystąpi wyjątek w środowisku ASP.NET Core, oprogramowanie pośrednie wyjątków ** wyczyści nagłówki **, więc nagłówki CORS zostaną utracone. Zobacz, co powoduje wyjątek i rozwiąż wyjątek, to powinno działać, kod Http 500 jest zwracany, gdy wystąpi wyjątek. – Tseng

+0

Czy możesz potwierdzić, że 'UserCors' jest przed wywołaniem' UseMvc' w metodzie 'Configure'? – regnauld

Odpowiedz

0

Trzeba coś takiego:

services.AddCors(options => 
     { 
     options.AddPolicy("CorsPolicy", 
      builder => 
      builder.AllowAnyOrigin() 
      .AllowAnyMethod() 
      .WithExposedHeaders("content-disposition") 
      .AllowAnyHeader() 
      .AllowCredentials() 
      .SetPreflightMaxAge(TimeSpan.FromSeconds(3600))); 
     }); 

Zawiadomienie AllowCredentials().

Należy również, w pliku StartupConfigure metody:

app.UseCors("CorsPolicy"); 
+0

Tak, mam appusingCors ("AllowAll") i dodanie preflight też nie pomogło. –

Powiązane problemy