c# - 在 WebAPI 中保存后返回文件名

标签 c# asp.net multithreading asp.net-web-api

我正在使用 Web API 上传图像。

public IHttpActionResult UploadImage()
{
     FileDescription filedescription = null;
    var allowedExt=new string[]{".png",".jpg",".jpeg"};
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    if (Request.Content.IsMimeMultipartContent())
    {
       Request.Content.LoadIntoBufferAsync().Wait();
       var imgTask = Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()).ContinueWith((task) =>
        {   
                MultipartMemoryStreamProvider provider = task.Result;
                var content = provider.Contents.ElementAt(0);
                Stream stream = content.ReadAsStreamAsync().Result;
                Image image = Image.FromStream(stream);
                var receivedFileName = content.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
                var getExtension = Path.GetExtension(receivedFileName);                      
                if(allowedExt.Contains(getExtension.ToLower())){
                    string newFileName = "TheButler" + DateTime.Now.Ticks.ToString() + getExtension;
                    var originalPath = Path.Combine("Folder Path Here", newFileName);
                    image.Save(originalPath);
                    var picture = new Images
                    {
                        ImagePath = newFileName
                    };
                    repos.ImagesRepo.Insert(picture);
                    repos.SaveChanges();
                    filedescription = new FileDescription(imagePath + newFileName, picture.Identifier); 
                }
        });

      if (filedescription == null)
       {
           return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, new { message="some error msg."}));
       }
       else
       {
           return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, filedescription));
       }
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, new { message = "This request is not properly formatted" }));
    }
}

上面的代码我用来保存图片,但是每次 filedescription 即使图片保存成功。我在这里做错了什么。

我想在图像保存后返回文件描述。

最佳答案

您以错误的方式使用了很多 async 方法。您永远不应该调用 async 方法,然后等待它以同步方式完成(例如使用 Wait()Result ).

如果一个 API 公开了一个async 方法,然后为它await,同时将调用方法变成一个async 方法。

您的 filedescription 变量始终为 null 的原因是因为您在继续完成之前检查它。这确实是一种糟糕的做法:如果您需要一个 async 操作的结果值,那么您必须等待它完成,但在这种情况下,使用 await 关键字。

这是调用 async 方法并等待(异步)它们完成的正确方法:

public async Task<IHttpActionResult> UploadImage()
{
    FileDescription filedescription = null;
    var allowedExt = new string[] { ".png", ".jpg", ".jpeg" };
    var result = new HttpResponseMessage(HttpStatusCode.OK);
    if (Request.Content.IsMimeMultipartContent())
    {
        await Request.Content.LoadIntoBufferAsync();
        var provider = await Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider());

        var content = provider.Contents.ElementAt(0);
        Stream stream = await content.ReadAsStreamAsync();
        Image image = Image.FromStream(stream);
        var receivedFileName = content.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        var getExtension = Path.GetExtension(receivedFileName);
        if (allowedExt.Contains(getExtension.ToLower()))
        {
            string newFileName = "TheButler" + DateTime.Now.Ticks.ToString() + getExtension;
            var originalPath = Path.Combine("Folder Path Here", newFileName);
            image.Save(originalPath);
            var picture = new Images
            {
                ImagePath = newFileName
            };
            repos.ImagesRepo.Insert(picture);
            repos.SaveChanges();
            filedescription = new FileDescription(imagePath + newFileName, picture.Identifier);
        }

        if (filedescription == null)
        {
            return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, new { message = "some error msg." }));
        }
        else
        {
            return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, filedescription));
        }
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, new { message = "This request is not properly formatted" }));
    }
}

关于c# - 在 WebAPI 中保存后返回文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36796267/

相关文章:

c# - 你可以传递没有类型参数的泛型委托(delegate)吗?

c# - Linq 是否根据实际集合类型优化执行?

c# - 使用 LINQ 将字符串转换为 int 数组

asp.net - 使用 ASP.NET 从 Microsoft Dynamics Nav 检索二进制/Blob 文件

javascript - jQuery 事件未从我的 asp.net 控件触发

java - 执行线程核心数

c# - DateTime 表示和转换显示错误的日期

javascript - 如何序列化此 JSON 对象?

java - 为什么线程会按这个顺序执行?

c# - ReaderWriterLockSlim.EnterUpgradeableReadLock() 本质上与 Monitor.Enter() 相同吗?