La diffusion de gros fichiers (>2 GO sur IIS) à l'aide de WebAPI

Je suis en train de télécharger des fichiers très volumineux (>2 GO) à mon WebAPI application (en cours d'Exécution sur .NET 4.5.2, Windows 2012R2).

Réglage de la httpRuntime maxRequestLength propriété est d'aucune utilité, car c'est seulement à travailler avec des fichiers de taille inférieure à 2 GO.

Je suis actuellement en utilisant un custom MultipartFormDataStreamProvider pour lire l'intégralité du flux sur le Serveur et je l'ai déjà désactivé mise en mémoire tampon à l'aide d'un custom WebHostBufferPolicySelector.

Ce que j'ai découvert, c'est que ASP.NET (ou WebAPI d'ailleurs) utilise une HttpBufferlessInputStream sous le Capot qui a un champ appelé _disableMaxRequestLength. Si j'ai mis cette valeur à true (par réflexion), je peut diffuser des fichiers de toute taille.

Cependant, de bidouiller ces avec ces internas est clairement pas une bonne façon.

HttpRequest de classe utilisé pour la demande a une méthode appelée GetBufferlessInputStream qui a une surcharge qui permet de désactiver le maxRequestLength.

Ma question est: Comment puis-je obtenir la WebAPI à utiliser cette surcharge au lieu de la Norme?

Est-il possible de remplacer la valeur par Défaut HttpRequest ou HttpContext classe? Ou dois-je vraiment Besoin d'utiliser la réflexion pour l'ensemble des trucs?

C'est le code que j'utilise actuellement pour désactiver le maxRequestLength:

    private void DisableRequestLengthOnStream(HttpContent parent)
    {
        var streamContentProperty = parent.GetType().GetProperty("StreamContent", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        if (streamContentProperty == null) return;
        var streamContent = streamContentProperty.GetValue(parent, null);
        if (streamContent == null) return;
        var contentProperty = typeof(StreamContent).GetField("content", BindingFlags.Instance | BindingFlags.NonPublic);
        if (contentProperty == null) return;
        var content = contentProperty.GetValue(streamContent);
        if (content == null) return;
        var requestLengthField = content.GetType().GetField("_disableMaxRequestLength", BindingFlags.Instance | BindingFlags.NonPublic);
        if (requestLengthField == null) return;
        requestLengthField.SetValue(content, true);
    }
  • +1 question Très intéressante. Par curiosité, avez-vous songé seulement à l'aide de FTP pour faire le transfert?
  • Ce n'est pas possible dans mon Scénario...
  • Par 'standard', entendez-vous à l'aide d'un InputString?
  • Il y a deux GetBufferlessInputStream méthodes sur la HttpRequest classe. On prend un Paramètre qui Commute le maxRequestCheck on/off, et l'autre Retourne le HttpBufferlessInputStream avec la Case activé.
  • Krause Donner à cette lecture. strathweb.com/2012/09/...