Jquery ASP.NET WEBAPI文件上载,IE9问题

Jquery ASP.NET WEBAPI文件上载,IE9问题,jquery,internet-explorer-9,asp.net-web-api,jquery-forms-plugin,asyncfileupload,Jquery,Internet Explorer 9,Asp.net Web Api,Jquery Forms Plugin,Asyncfileupload,我使用ASP.NET WEBAPI创建了一个文件上载方法,代码如下: [DataContract] public class FileDesc { [DataMember] public string name { get; set; } [DataMember] public string url { get; set; } [DataMember] public l

我使用ASP.NET WEBAPI创建了一个文件上载方法,代码如下:

[DataContract]
    public class FileDesc
    {
        [DataMember]
        public string name { get; set; }      

        [DataMember]
        public string url { get; set; }

        [DataMember]
        public long size { get; set; }

        [DataMember]
        public string UniqueFileName { get; set; }

        [DataMember]
        public int id { get; set; }

        [DataMember]
        public DateTime modifiedon { get; set; }

        [DataMember]
        public string description { get; set; }


        public FileDesc(string rootUrl, FileInfo f,int pId, string aFileName)
        {
            id = pId;
            name = aFileName;
            UniqueFileName = f.Name;
            url = rootUrl + "/Files/" + f.Name;
            size = f.Length / 1024;
            modifiedon = f.LastWriteTime;
            description = aFileName;
        }
    }

    public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
    {
        //string uniqueFileName = string.Empty;

        public string UniqueFileName
        {
            get;
            set;
        }
        public string ActualFileName
        {
            get;
            set;
        }

        public int TaskID { get; set; }
        private int UserID { get; set; }
        public CustomMultipartFormDataStreamProvider(string path, int ptaskID, int pUserID)
            : base(path)
        {
            TaskID = ptaskID;
            UserID = pUserID;
        }

        public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
        {
            var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? headers.ContentDisposition.FileName : "NoName";

            ActualFileName = name.Replace("\"", string.Empty);

            ActualFileName = Path.GetFileName(ActualFileName);

            UniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(ActualFileName);

            int id = SaveFileInfoIntoDatabase(ActualFileName, TaskID, UniqueFileName, UserID);

            headers.Add("ActualFileName", ActualFileName);
            headers.Add("id", id.ToString());

            return UniqueFileName;

        }   
    }
    [Authorize]
    public class FileUploadController : ApiController
    {

        private string StorageRoot
        {
            get { return Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/Files/")); } //Path should! always end with '/'
        }


        public Task<IEnumerable<FileDesc>> Post(int id)        
        {

            string folderName = "Files";
            string PATH = HttpContext.Current.Server.MapPath("~/" + folderName);
            string rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty);
            HttpContext.Current.Response.BufferOutput = true;
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.ContentType = "text/html";

            if (Request.Content.IsMimeMultipartContent())
            {
                var streamProvider = new CustomMultipartFormDataStreamProvider(PATH, id, BEL_PMS.Utilities.FormsAuthenticationUtil.GetCurrentUserID);
                var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<IEnumerable<FileDesc>>(t =>
                {

                    if (t.IsFaulted || t.IsCanceled)
                    {
                        throw new HttpResponseException(HttpStatusCode.InternalServerError);
                    }

                    var fileInfo = streamProvider.FileData.Select(i =>
                    {

                        var info = new FileInfo(i.LocalFileName);
                        int FileID = Convert.ToInt32((from h in i.Headers where h.Key =="id" select h.Value.First()).FirstOrDefault());
                        string ActualFileName = (from h in i.Headers where h.Key =="ActualFileName" select h.Value.First()).FirstOrDefault();
                        return new FileDesc(rootUrl, info, FileID, ActualFileName);
                    });
                    return fileInfo;
                });


                //return new HttpResponseMessage { StatusCode = System.Net.HttpStatusCode.OK, Content = task};               
                return task;
            }
            else
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
            }

        }
}
$('#frmmultiupload').ajaxForm({
            success: OnUploadedSuccessfully,            
            error: function (x, y) {
                mesg('Error occured while file upload! Please make sure that total file size is less than 4 MB and try again.',
                    'error', 'File upload failed.');
            }
        });
文件中的一切都正常,但它在IE9中产生了问题

IE说“您想从本地主机打开还是保存?”

以下是网络跟踪: 我发现了一些提示,但我不知道如何将
任务
转换为
任务


我在ajaxSetup中指定了30秒的超时时间,因此30秒后会产生错误。

我也遇到过类似的问题,只有在IE中提交表单时才会出现此问题,并且它所引用的WebApi函数会返回一些值。对于此问题,我们尚未找到理想的解决方案

在本例中,我们所做的是将函数拆分为两个调用。第一个函数将在数据库中保存详细信息(假设上载成功),在回调时,我们将提交表单以上载文件。webapi上载函数的返回类型为
void
。如果上传失败,我们将在错误回调中处理,然后从数据库中删除相应的条目

我知道这根本不是一个好办法,但我们不得不接受

请检查此项。

var task=Request.Content.ReadAsMultipartAsync(streamProvider)。ContinueWith(t=>
{
如果(t.IsFaulted | | t.IsCanceled)
{
抛出新的HttpResponseException(HttpStatusCode.InternalServerError);
}
var fileInfo=streamProvider.FileData.Select(i=>
{
var info=新文件信息(i.LocalFileName);
int FileID=Convert.ToInt32((从i.Headers中的h开始,其中h.Key==“id”选择h.Value.First()).FirstOrDefault());
字符串ActualFileName=(从i.Headers中的h开始,其中h.Key==“ActualFileName”选择h.Value.First()).FirstOrDefault();
返回新的FileDesc(rootUrl、info、FileID、ActualFileName);
});
var response=Request.CreateResponse(HttpStatusCode.OK,fileInfo);
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“文本/html”);
返回响应;
});

IE 9不支持新的XMLHttpRequest级别2(仅IE10+),这意味着jquery.form.js插件使用iframe回退。

阅读本文:由jquery.form.js插件的创建者发布。他表示,如果返回的数据是JSON或脚本,IE将提示下载。如果返回JSON,Jou必须强制内容类型标题为“text/html”。

Hay Wizzardz,谢谢你的建议。我找到了答案并编辑了我的问题。我发现,如果我们将WEBAPI的返回类型设置为void,他们开始用IE9产生问题,WEBAPI返回状态代码204而不是201,IE无法理解。嗨,伙计,你说得对,这是正确的方法,工作正常。如果您可以将其作为答案发布,并接受相同的答案,而不是编辑问题,则更好:)如果此答案对您有效,请将其标记为已回答,这将对其他有类似问题的人有所帮助。
var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<HttpResponseMessage>(t =>
{
    if (t.IsFaulted || t.IsCanceled)
    {
        throw new HttpResponseException(HttpStatusCode.InternalServerError);
    }

    var fileInfo = streamProvider.FileData.Select(i =>
    {

        var info = new FileInfo(i.LocalFileName);
        int FileID = Convert.ToInt32((from h in i.Headers where h.Key =="id" select h.Value.First()).FirstOrDefault());
        string ActualFileName = (from h in i.Headers where h.Key =="ActualFileName" select h.Value.First()).FirstOrDefault();
        return new FileDesc(rootUrl, info, FileID, ActualFileName);
    });
    var response = Request.CreateResponse(HttpStatusCode.OK, fileInfo);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
    return response;
});