Asynchronous 使用XmlHttpRequest进行Web API异步上载以获得进度

Asynchronous 使用XmlHttpRequest进行Web API异步上载以获得进度,asynchronous,upload,asp.net-web-api,xmlhttprequest,progress-bar,Asynchronous,Upload,Asp.net Web Api,Xmlhttprequest,Progress Bar,我正在尝试用进度条拖放文件上载 我有一个div,它正在监听被丢弃的文件,并且工作得很好。 那我就 //Setting up a XmlHttpRequest xhr = new XMLHttpRequest(); //Open connection xhr.open("post", "api/ImageUpload", true); // Set appropriate headers xhr.setRequestHeader("Content-Type", "multipart/form

我正在尝试用进度条拖放文件上载

我有一个div,它正在监听被丢弃的文件,并且工作得很好。 那我就

//Setting up a XmlHttpRequest 
xhr = new XMLHttpRequest();

//Open connection
xhr.open("post", "api/ImageUpload", true);

// Set appropriate headers
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader("X-File-Type", uf.type);
xhr.setRequestHeader("X-File-Name", uf.name);
xhr.setRequestHeader("X-File-Size", uf.size);
这将很好地将流作为请求主体发送到Web API(非异步)

我正在尝试将请求转换为“public async TaskPost(){}”

如果该方法在页面上使用多部分表单而不是XmlHttpRequest,我会使用“wait Request.Content.ReadAsMultipartAsync(provider)”,但在我需要它的时候似乎没有填充它

那么,正确的做法是在Web API上处理来自XmlHttpRequest的异步调用,并使用XHR的进度事件记录请求期间的进度

到目前为止,我已经查看了大量页面以找到解决方案,但这是我主要使用的页面。

谢谢你的帮助
奥利弗

看起来好像有人向你提出了同样的问题,并且得到了答案。请看一下。 这是微软的一个例子

我将上述两种解决方案结合在一起,为我工作(只需稍作调整)

  • JavaScriptp中的一行更改

    xhr.open(“post”、“api/upload”、true)

  • 使用流保存文件

  • 公共类上载控制器:ApiController
    {
    公共异步任务PostFormData()
    {
    string root=HttpContext.Current.Server.MapPath(“~/App_Data”);
    var fileName=Path.Combine(root,Request.Headers.GetValues(“X-File-Name”).First());
    尝试
    {
    var writer=新的StreamWriter(文件名);
    wait Request.Content.CopyToAsync(writer.BaseStream);
    writer.Close();
    返回Request.CreateResponse(HttpStatusCode.OK);
    }
    捕获(System.e例外)
    {
    返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
    }
    }
    }
    

    谢谢你的回复,但遗憾的是我已经看到了2个链接。
    [System.Web.Mvc.HttpPost]
    public string Post()
    {
        Stream stream =  HttpContext.Current.Request.InputStream;
        String filename = HttpContext.Current.Request.Headers["X-File-Name"];
    
        FileModel file = uploadService.UploadFile(stream, filename);
        return file.Id.ToString();
     }
    
    public class UploadController : ApiController
    {
        public async Task<HttpResponseMessage> PostFormData()
        {
            string root = HttpContext.Current.Server.MapPath("~/App_Data");
            var fileName = Path.Combine(root, Request.Headers.GetValues("X-File-Name").First());
            try
            {
                var writer = new StreamWriter(fileName);
                await Request.Content.CopyToAsync(writer.BaseStream);
                writer.Close();
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            catch (System.Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
        }
    }