C# 异步方法首次在多个映像上载上运行失败

C# 异步方法首次在多个映像上载上运行失败,c#,asp.net-mvc,azure,asyncfileupload,C#,Asp.net Mvc,Azure,Asyncfileupload,我有一个网站,摄影师可以上传照片。该网站托管在一个共享的azure web应用程序上,照片和照片的缩略图将上载到azure Blob存储,并将记录写入数据库。摄影师一次最多可以上传700mb的照片 我的问题 我有一个同步上传方法,a)运行了很长时间,B)出现了“磁盘空间不足”错误消息,失败了。我猜这是因为Azure共享web应用程序的临时文件夹限制为200mb 我试图实现一个异步方法来帮助加快上传速度,但它成功地完成了第一张照片(即存在blob和db记录),然后它似乎就挂起了。这是我第一次尝试编

我有一个网站,摄影师可以上传照片。该网站托管在一个共享的azure web应用程序上,照片和照片的缩略图将上载到azure Blob存储,并将记录写入数据库。摄影师一次最多可以上传700mb的照片

我的问题

我有一个同步上传方法,a)运行了很长时间,B)出现了“磁盘空间不足”错误消息,失败了。我猜这是因为Azure共享web应用程序的临时文件夹限制为200mb

我试图实现一个异步方法来帮助加快上传速度,但它成功地完成了第一张照片(即存在blob和db记录),然后它似乎就挂起了。这是我第一次尝试编写异步方法

我也不知道如何解决临时文件夹大小的问题

我的呼叫方法

    public static async Task<Tuple<bool, string>> UploadAsync(HttpPostedFileBase[] photos, Bookings booking, string photoType, ApplicationUser user)
    {

        // For each file to be uploaded
        foreach (HttpPostedFileBase file in photos)
        {
            try
            {
                await UploadPhotoFromFileAsync(file, user, booking.BookingsId, photoType);

            }
            catch (Exception ex)
            {
                // Not Implemented
            }
        }

        return new Tuple<bool, string>(true, "Photos uploaded successfully");
    }
publicstaticasync任务UploadAsync(HttpPostedFileBase[]照片、预订、字符串照片类型、应用程序用户)
{
//对于要上载的每个文件
foreach(照片中的HttpPostedFileBase文件)
{
尝试
{
等待上载PhotoFromFileAsync(文件、用户、booking.bookingId、photoType);
}
捕获(例外情况除外)
{
//未实施
}
}
返回新元组(true,“照片上传成功”);
}
我的照片上传方法

    public static Task UploadPhotoFromFileAsync(HttpPostedFileBase file, ApplicationUser user, int bookingId, string photoType)
    {
        return Task.Run(() =>
        {
            using (ApplicationDbContext dbt = new ApplicationDbContext())
            {
                Bookings booking = dbt.Bookings.Find(bookingId);

                // Craete a new record in the UserFiles table
                Photos photo = new Photos();
                photo.BookingsId = booking.BookingsId;
                photo.PhotoType = photoType;
                photo.FileName = Path.GetFileName(file.FileName);

                string confirmedDate = string.Empty;
                if (booking.ConfirmedDate.HasValue)
                {
                    DateTime actualConfirmedDate = booking.ConfirmedDate.Value;
                    confirmedDate = actualConfirmedDate.Year.ToString() + actualConfirmedDate.Month.ToString() + actualConfirmedDate.Day.ToString();
                }

                string blobName = string.Empty;
                string blobThumbName = string.Empty;
                if (photoType == "SamplePhoto")
                {
                    // Get the count of the sample photos in the gallery 
                    List<Photos> samplePhotos = dbt.Photos.Where(m => m.BookingsId == booking.BookingsId && m.PhotoType == "SamplePhoto").ToList();

                    blobName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (samplePhotos.Count).ToString() + "_sample" + Path.GetExtension(file.FileName);
                    blobThumbName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (samplePhotos.Count).ToString() + "_sample_thumb" + Path.GetExtension(file.FileName);
                }
                else
                {
                    // Get the count of the sample photos in the gallery 
                    List<Photos> photos = dbt.Photos.Where(m => m.BookingsId == booking.BookingsId && m.PhotoType == "GalleryPhoto").ToList();

                    blobName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (photos.Count).ToString() + Path.GetExtension(file.FileName);
                    blobThumbName = "TS_" + booking.location.Location.Replace(" ", "") + "_" + booking.BookingsId.ToString() + "_" + confirmedDate + "_" + (photos.Count).ToString() + "_thumb" + Path.GetExtension(file.FileName);
                }

                // Create the Thumbnail image.
                CloudBlobContainer thumbnailBlobContainer = _blobStorageService.GetCloudBlobContainer("thumbnails");
                if (CreateThumbnailImageFromHttpPostedFileBase(file, blobThumbName, photo))
                {
                    photo.ThumbnailBlobName = blobThumbName;
                    photo.ThumbnailBlobUrl = thumbnailBlobContainer.Uri + "/" + blobThumbName;
                }

                CloudBlobContainer blobContainer = _blobStorageService.GetCloudBlobContainer("photos");
                photo.BlobName = blobName;
                photo.BlobUrl = blobContainer.Uri + "/" + blobName;

                photo.DateCreated = DateTime.Now;
                photo.CreatedBy = user.Id;

                dbt.Photos.Add(photo);
                dbt.SaveChanges();

                booking.Photos.Add(photo);
                dbt.SaveChanges();

                //Upload to Azure Blob Storage
                CloudBlockBlob blob = blobContainer.GetBlockBlobReference(blobName);
                blob.UploadFromStream(file.InputStream);
            }
        });
    }
public static Task UploadPhotoFromFileAsync(HttpPostedFileBase文件,ApplicationUser用户,int bookingId,string photoType)
{
返回任务。运行(()=>
{
使用(ApplicationDbContext dbt=new ApplicationDbContext())
{
Bookings booking=dbt.Bookings.Find(bookingId);
//在UserFiles表中创建新记录
照片=新照片();
photo.BookingsId=booking.BookingsId;
photo.PhotoType=PhotoType;
photo.FileName=Path.GetFileName(file.FileName);
string confirmedDate=string.Empty;
if(booking.ConfirmedDate.HasValue)
{
DateTime actualConfirmedDate=booking.ConfirmedDate.Value;
confirmedDate=actualConfirmedDate.Year.ToString()+actualConfirmedDate.Month.ToString()+actualConfirmedDate.Day.ToString();
}
string blobName=string.Empty;
string blobThumbName=string.Empty;
如果(照片类型=“样本照片”)
{
//获取图库中示例照片的数量
列出samplePhotos=dbt.Photos.Where(m=>m.BookingsId==booking.BookingsId&&m.PhotoType==“SamplePhoto”).ToList();
blobName=“TS_“+booking.location.location.Replace(“,”)+““+booking.BookingsId.ToString()+”“+confirmedDate+”“+(samplePhotos.Count).ToString()+“sample”+Path.GetExtension(file.FileName);
blobThumbName=“TS_“+booking.location.location.location.Replace(“,”)+““+booking.BookingsId.ToString()+”“+confirmedDate+”“+(samplePhotos.Count).ToString()+“sample_thumb”+Path.GetExtension(file.FileName);
}
其他的
{
//获取图库中示例照片的数量
List photos=dbt.photos.Where(m=>m.BookingsId==booking.BookingsId&&m.PhotoType==“GalleryPhoto”).ToList();
blobName=“TS_”+booking.location.location.Replace(“,”)+“”+booking.BookingsId.ToString()+“”+confirmedDate+“”+(photos.Count).ToString()+Path.GetExtension(file.FileName);
blobThumbName=“TS_“+booking.location.location.Replace(“,”)+““+booking.BookingsId.ToString()+”“+confirmedDate+”“+(photos.Count).ToString()+“thumb”+Path.GetExtension(file.FileName);
}
//创建缩略图图像。
CloudBlobContainer缩略图BlobContainer=\u blobStorageService.GetCloudBlobContainer(“缩略图”);
if(从HttpPostedFileBase创建ThumbThumbNailImagefromHttpPostedFileBase(文件、blobThumbName、照片))
{
photo.ThumbnailBlobName=blobThumbName;
photo.ThumbnailBlobUrl=thumbnailBlobContainer.Uri+“/”+blobThumbName;
}
CloudBlobContainer blobContainer=\u blobStorageService.GetCloudBlobContainer(“照片”);
photo.BlobName=BlobName;
photo.BlobUrl=blobContainer.Uri+“/”+blobName;
photo.DateCreated=DateTime.Now;
photo.CreatedBy=user.Id;
dbt.Photos.Add(照片);
dbt.SaveChanges();
预订。照片。添加(照片);
dbt.SaveChanges();
//上载到Azure Blob存储
CloudBlockBlob blob=blobContainer.GetBlockBlobReference(blobName);
UploadFromStream(file.InputStream);
}
});
}

Azure存储库包含异步方法,您应该利用这些方法。您可以使用,而不是使用Task.Run包装控制器方法

因此,首先,使控制器的方法异步:

public async Task<ContentResult> UploadPhotoFromFileAsync...

问题实际上是由Web.Config中设置的请求长度引起的。它不够高,无法容纳上传照片的大小。我只是在Web.Config中添加了以下代码

<system.web>
     <httpRuntime targetFramework="4.5" maxRequestLength="1048576" executionTimeout="900" />
</system.web>
<system.webServer>
    <modules>
        <remove name="FormsAuthentication" />
    </modules>
</system.webServer>


这可能有助于增加临时文件夹的大小:嗨@Kayani,我看过这个,但我有一个web应用程序,而不是云服务。你知道如何在网络应用程序中实现这一点吗?嗨,迈克尔,我试过了,但第一次运行时它仍然锁定。我读了一些书
<system.web>
     <httpRuntime targetFramework="4.5" maxRequestLength="1048576" executionTimeout="900" />
</system.web>
<system.webServer>
    <modules>
        <remove name="FormsAuthentication" />
    </modules>
</system.webServer>