iOS 6 (iPhone/iPad) per Caricare le Immagini “Richiesta di Flusso di Corpo Esausto” con NTLM/Autenticazione di Windows

Sto lavorando per cercare di ottenere iOS 6 per l’uso di XMLHttpRequest Post per caricare le immagini. Questo funziona su desktop e Android browser web, ma con iOS 6 ricevo un errore in una pagina e inviato a: “Richiesta di Flusso di Corpo Esausto”. (Utilizzando il Simulatore iOS con il Web Safari di Ispezione).

Qui è il codice di base della pagina:

function fileSelected() {
    var file = document.getElementById('fileToUpload').files[0];
    if (file) {
        var fileSize = 0;
        if (file.size > 1024 * 1024)
            fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
        else
            fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
        document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
        document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
        document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
    }
}
function uploadFile() {
    var fd = new FormData();
    fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
    var xhr = new XMLHttpRequest();
    xhr.upload.addEventListener("progress", uploadProgress, false);
    xhr.addEventListener("load", uploadComplete, false);
    xhr.addEventListener("error", uploadFailed, false);
    xhr.addEventListener("abort", uploadCanceled, false);
    xhr.open("POST", "/UploadHandler.ashx");
    xhr.send(fd);
}
function uploadProgress(evt) {
    if (evt.lengthComputable) {
        var percentComplete = Math.round(evt.loaded * 100 / evt.total);
        document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
        document.getElementById('prog').value = percentComplete;
    }
    else {
        document.getElementById('progressNumber').innerHTML = 'unable to compute';
    }
}
function uploadComplete(evt) {
    /* This event is raised when the server send back a response */
    alert(evt.target.responseText);
}
function uploadFailed(evt) {
    alert("There was an error attempting to upload the file.");
}
function uploadCanceled(evt) {
    alert("The upload has been canceled by the user or the browser dropped the connection.");
}

Quando si fa questo su qualsiasi altro browser, il gestore restituisce correttamente e carica il file. Tuttavia, con iOS il ashx pagina è in errore “richiesta di flusso di corpo esausto”.

Ecco uno screenshot della finestra di ispezione:

iOS 6 (iPhone/iPad) per Caricare le Immagini “Richiesta di Flusso di Corpo Esausto” con NTLM/Autenticazione di Windows

Tutte le idee?

AGGIORNAMENTO: Questo problema si verifica solo quando NTLM/autenticazione di Windows è attivato per l’applicazione in IIS. Con le forme o l’autenticazione anonima, il caricamento funziona bene.

Grazie,

Giovanni

InformationsquelleAutor John Chapman | 2012-10-02



3 Replies
  1. 5

    In iOS 6, Safari invia il file con il post iniziale, compreso il file. Ciò significa che il flusso di file è, alla fine, o “esaurito.”

    Tuttavia, con NTLM, per ottenere un 401 in risposta, e quindi inviare di nuovo il post con le informazioni di autenticazione. Perché non ripristinare il flusso di file, non è in grado di inviare nuovamente il file con il secondo post. Come si può vedere i registri di IIS.

    Per quanto ne so, non c’è in particolare un buon modo intorno ad esso. Sto cambiando la mia app per dispositivi mobili, in modo che utilizzi la forma di autenticazione. Ho diretto l’app mobile per un accesso separato app sullo stesso server, che è impostato per utilizzare l’Autenticazione di Windows. Il login app può reindirizzare l’app con una forma di cookie di autenticazione, e tutto è di nuovo bene.

    Devi impostare la macchina in chiave su entrambe le applicazioni web.file di configurazione, in modo che si sta utilizzando le stesse chiavi per la crittografia e la convalida.

    Il codice di accesso dell’app è semplice come

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ 
    Handles Me.Load
        With HttpContext.Current.User.Identity
            If .IsAuthenticated Then
                Dim sUser As String = .Name.ToLower.Trim
                FormsAuthentication.RedirectFromLoginPage(s, False)
            End If
        End With
    End Sub
    • Che è quello che ho osservato anche. La tua soluzione è interessante. Per il momento (ho inviato un bug di Apple per vedere se possono risolvere), io in realtà hanno la possibilità di caricare file in un non Autenticata iframe che carica un file ASP.NET cartella temp e passa indietro di un token di autenticazione pagina utilizza quindi il riferimento di recuperare il file dalla cartella temp.
    • C’è una soluzione? Forse tramite WCF, o magari usando qualche altra tecnica? Io sono su SharePoint, e windows auth è un requisito.
  2. 0

    Ho risolto il problema di non impostare l’auto-definito HTTP Autenticare Testa su iOS 7 e iOS 8. (In un primo momento, il nostro servizio di self-valore definito per l’Autenticazione Testa). E dopo la sfida di essere gestita dal delegato, la richiesta Autenticazione: NTLMxxx automaticamente” intestazione automaticamente. E il Put e POST funziona di nuovo.

  3. 0

    Questo errore Arriva su IOS ma si può usare un approccio diverso
    come cambiare la tua riga di codice in formdata in cui si allegano i file

    var fd = new FormData();
    
    fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);

    al di sotto della linea fondamentalmente non aggiungere il file di controllo, ma di utilizzare il base64 dati di immagine

    var reader = new FileReader();
    
    reader.readAsDataURL(opmlFile.files[0]);
    
    reader.onload = function () {
    
        var base64DataImg = reader.result;            
    
        base64DataImg = base64DataImg.replace('data:'imagetype';base64,', '');      
    
    }

Lascia un commento