iOS 6 (iPhone/iPad) 图片上传“请求正文流用尽"使用 NTLM/Windows 身份验证 [英] iOS 6 (iPhone/iPad) Image Upload "Request Body Stream Exhausted" with NTLM/Windows Authentication

查看:20
本文介绍了iOS 6 (iPhone/iPad) 图片上传“请求正文流用尽"使用 NTLM/Windows 身份验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试让 iOS 6 使用 XMLHttpRequest POST 上传图像.这适用于桌面和 Android 网络浏览器,但在 iOS 6 上,我在发布到的页面上收到错误:请求正文流已用尽".(将 iOS 模拟器与 Safari Web Inspector 结合使用).

I am working on trying to get iOS 6 to use XMLHttpRequest POSTs to upload images. This works on desktop and Android web browsers, but with iOS 6 I am getting an error on the page being posted to: "Request Body Stream Exhausted". (Using iOS Simulator with the Safari Web Inspector).

这是页面的基本代码:

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.");
}

在任何其他浏览器上执行此操作时,处理程序会正确返回并上传文件.但是,对于 iOS,ashx 页面出现错误请求正文流已用尽".

When doing this on any other browser, the handler returns correctly and uploads the file. However, with iOS the ashx page has the error "request body stream exhausted".

这是检查器的截图:

有什么想法吗?

更新:只有在 IIS 中为应用程序启用 NTLM/Windows 身份验证时才会出现此问题.使用表单或匿名身份验证,上传工作正常.

UPDATE: This issue only occurs when NTLM/Windows authentication is enabled for the application in IIS. With forms or anonymous authentication, the upload works fine.

谢谢,

约翰

推荐答案

在 iOS 6 中,Safari 发送带有初始帖子的文件,包括文件.这意味着文件流已结束,或用尽".

In iOS 6, Safari sends the file with the initial post, including the file. That means the file stream is at the end, or "exhausted."

但是,使用 NTLM,它会收到 401 质询作为响应,然后必须重新发送带有身份验证信息的帖子.由于它不会重置文件流,因此无法使用第二个帖子再次发送文件.您可以在 IIS 日志中看到这一点.

However, with NTLM, it will get a 401 challenge in response, and then have to resend the post with the authentication information. Since it does not reset the file stream, it is unable to send the file again with the second post. You can see this in the IIS logs.

据我所知,没有特别好的解决方法.我正在更改我的移动应用程序,以便它使用表单身份验证.我将移动应用程序定向到同一服务器上的单独登录应用程序,该应用程序设置为使用 Windows 身份验证.然后登录应用可以使用表单身份验证 cookie 重定向回主应用,一切都恢复正常.

As far as I know, there is no particularly good way around it. I am changing my mobile app, so that it uses form authentication. I direct the mobile app to a separate login app on the same server, which is set to use Windows Authentication. The login app can then redirect back to the main app with a form authentication cookie, and all is well again.

您必须在 web.config 文件中为两个应用程序设置机器密钥,以便两者使用相同的密钥进行加密和验证.

You have to set the machine key on both apps in the web.config file, so that both are using the same keys for encryption and validation.

登录应用上的代码很简单

The code on the login app is as simple as

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

这篇关于iOS 6 (iPhone/iPad) 图片上传“请求正文流用尽"使用 NTLM/Windows 身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆