Upload von großen Dateien mit Backload/Blueimp schlägt fehl

Für unser Tool Zeta Uploader habe ich virtuelle Datenräume umgesetzt.

Dabei habe ich die Upload-Komponente Backload zusammen mit dem BlueImp jQuery File Upload eingesetzt.

In meiner Entwicklungsumgebung lokal lief alles. Auf dem Testserver (Windows 2012 R2) kam immer Fehlermeldungen.

Es sah so aus, als ob keine Datei hochgeladen wurde.

Analyse

Ich habe zunächst das Server-Tracing aktiviert (geht erst mit der kommerziellen Version von Backload) und dort dann festgestellt, dass immer GET-Requests ankamen, und keine POST-Requests wie lokal in meiner Umgebung.

Weiter in den Developer Tools von Google Chrome habe ich festgestellt, dass er die URL von der Upload-Controller-Action korrekt aufruft aber dann einen Redirect 301 erhält.

Ursache

Ursache ist, dass ich im Projekt das NuGet-Paket LowercaseRoutesMVC4 nutze. Das sorgt dafür, dass alle Buchstaben in der Basis-URL in Kleinbuchstaben umgewandelt werden.

Und genau so war es auch bei der Upload-Action-URL:

  1. Ich schreibe im Quelltext die URL mit einigen Großbuchstaben.
  2. Die Anfrage geht korrekt via POST zum Server.
  3. Der Server sagt „301“.
  4. An die neue URL wird nicht mehr mit POST sondern mit GET gesendet.

Das bringt dann alles durcheinander.

Lösung

Die Lösung war, dass ich die URL schlicht und einfach in Kleinbuchstaben in meinen Quelltext geschrieben habe:

var url = '@Url.Content((@"~/Backload/FileHandler?objectContext=" + @unique).ToLowerInvariant())';

So trivial und 6 Stunden Fehlersuche :expressionless:.

Und noch eine ähnliche Konstellation hat mich wieder viel Zeit gekostet:

Ich habe eine Klasse MultiCultureMvcRedirectRouteHandler im Projekt erstellt und verwendet, die als Route-Handler, abgeleitet von MvcRouteHandler implementiert ist.

Darin habe ich sicher gestellt, dass in der URL immer eine Sprache enthalten ist (z.B. „de“ oder „en“). Dementsprechend wird umgeleitet, falls keine Sprache enthalten ist.

Und genau das ist wieder beim Upload via Backload/Blueimp passiert.

Jetzt habe ich einfach eine plumpe Ausnahme in meinem Route-Handler drin:

if ( !requestContext.HttpContext.Request.RawUrl.ToLower().Contains("backload") )
{
    // ...
}

D.h. ich ignoriere „backload“-URLs; diese werden nicht umgeschrieben/redirected.

Und schon geht’s wieder :expressionless:.