1

我按照此tutorial從Azure Blob存儲上傳/下載Blob。下面「索引超出範圍」等待時發生錯誤Request.Content.ReadAsMultipartAsync(provider)

代碼工作完美,直到我實現了承載令牌認證(OAuth的)

我已經上載從postman.The任何文件得到了錯誤的錯誤描述。

{ 「消息」:「發生了錯誤的細節:。索引超出範圍必須大於 集合的大小非負少\ r \ n參數名稱索引:」}

但是,這些文件已成功上傳到我的Blob帳戶中,但仍然出現錯誤。

我附上了調試時獲得的錯誤詳細信息的圖像。

enter image description here

在那裏我已經提示錯誤在我上傳控制器

try 
      { 
       await Request.Content.ReadAsMultipartAsync(provider); 

      } 
      catch (Exception ex) 
      { 
       return BadRequest($"An error has occured. Details: {ex.Message}"); 
      } 

我AzureStorageMultipartFormDataStreamProvider類,這是從MultipartFormDataStreamProvider

public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
     { 


       if (parent == null) throw new ArgumentNullException(nameof(parent)); 
       if (headers == null) throw new ArgumentNullException(nameof(headers)); 


      // Generate a new filename for every new blob 

      var fileName = Guid.NewGuid().ToString(); 
      CloudBlockBlob blob = _blobContainer.GetBlockBlobReference(fileName); 
      headers.ContentLength = 0; 

      if (headers.ContentType != null) 
       { 
        // Set appropriate content type for your uploaded file 
        blob.Properties.ContentType = headers.ContentType.MediaType; 
       } 

       this.FileData.Add(new MultipartFileData(headers, blob.Name)); 

       return blob.OpenWrite();   
     } 

繼承對於實施的oauth2區域。 0身份驗證我剛剛在我的項目中添加了啓動.cs和Startup.Auth.cs(使用re quired的NuGet包Owin

這裏是我的堆棧跟蹤

在System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument說法,ExceptionResource資源)在System.Collections.Generic.List 1.get_Item(Int32 index) at System.Net.Http.MultipartFormDataStreamProvider.<ExecutePostProcessingAsync>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Net.Http.HttpContentMultipartExtensions.<ReadAsMultipartAsync>d__0 1.MoveNext() - - 從拋出異常的以前位置結束堆棧跟蹤---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)上System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在System.Runtime.CompilerServices .TaskAwaiter`1.GetResult() 在DemoAzureStorage.Controllers.UploadController.d__1.MoveNext()

+0

共享調用堆棧/堆棧跟蹤。 – rene

+0

@rene更新了堆棧跟蹤 – Jayendran

回答

0

根據你的描述,我創建了一個測試演示(所有已安裝包是最新的一個)在我的身邊,它工作得很好。

我用谷歌登錄和AzureStorageMultipartFormDataStreamProvider作爲您的節目使用asp.net web api。

我上傳文件控制器代碼如下:

public class UploadController : ApiController 
{ 
    private const string Container = "mycontainer"; 

    [HttpPost] 
    public async Task<IHttpActionResult> UploadFile() 
    { 
     if (!Request.Content.IsMimeMultipartContent("form-data")) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 


     var storageAccount = CloudStorageAccount.Parse("connection string"); 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

     CloudBlobContainer imagesContainer = blobClient.GetContainerReference(Container); 
     var provider = new AzureStorageMultipartFormDataStreamProvider(imagesContainer); 

     try 
     { 
      await Request.Content.ReadAsMultipartAsync(provider); 
     } 
     catch (Exception ex) 
     { 
      return BadRequest($"An error has occured. Details: {ex.Message}"); 
     } 

     // Retrieve the filename of the file you have uploaded 
     var filename = provider.FileData.FirstOrDefault()?.LocalFileName; 
     if (string.IsNullOrEmpty(filename)) 
     { 
      return BadRequest("An error has occured while uploading your file. Please try again."); 
     } 

     return Ok($"File: {filename} has successfully uploaded"); 
    } 
} 

AzureStorageMultipartFormDataStreamProvider類:

public class AzureStorageMultipartFormDataStreamProvider : MultipartFormDataStreamProvider 
{ 
    private readonly CloudBlobContainer _blobContainer; 
    private readonly string[] _supportedMimeTypes = { "image/png", "image/jpeg", "image/jpg" }; 

    public AzureStorageMultipartFormDataStreamProvider(CloudBlobContainer blobContainer) : base("azure") 
    { 
     _blobContainer = blobContainer; 
    } 

    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
     if (parent == null) throw new ArgumentNullException(nameof(parent)); 
     if (headers == null) throw new ArgumentNullException(nameof(headers)); 

     if (!_supportedMimeTypes.Contains(headers.ContentType.ToString().ToLower())) 
     { 
      throw new NotSupportedException("Only jpeg and png are supported"); 
     } 

     // Generate a new filename for every new blob 
     var fileName = Guid.NewGuid().ToString(); 

     CloudBlockBlob blob = _blobContainer.GetBlockBlobReference(fileName); 

     if (headers.ContentType != null) 
     { 
      // Set appropriate content type for your uploaded file 
      blob.Properties.ContentType = headers.ContentType.MediaType; 
     } 

     this.FileData.Add(new MultipartFileData(headers, blob.Name)); 

     return blob.OpenWrite(); 
    } 

結果如下圖所示:

enter image description here

如果可能的話,你可以創建一個測試項目並推送到github或一個驅動器,我們重現您的問題。

Packages.config:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Antlr" version="3.4.1.9004" targetFramework="net46" /> 
    <package id="bootstrap" version="3.0.0" targetFramework="net46" /> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net46" /> 
    <package id="jQuery" version="1.10.2" targetFramework="net46" /> 
    <package id="Knockout.Validation" version="1.0.1" targetFramework="net46" /> 
    <package id="knockoutjs" version="2.3.0" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights" version="2.2.0" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.0.6" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.2.0" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.2.0" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights.Web" version="2.2.0" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights.WindowsServer" version="2.2.0" targetFramework="net46" /> 
    <package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.2.0" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.Identity.EntityFramework" version="2.2.1" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.Identity.Owin" version="2.2.1" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" /> 
    <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" /> 
    <package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net46" /> 
    <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" targetFramework="net46" /> 
    <package id="Microsoft.Data.Edm" version="5.8.2" targetFramework="net46" /> 
    <package id="Microsoft.Data.OData" version="5.8.2" targetFramework="net46" /> 
    <package id="Microsoft.Data.Services.Client" version="5.8.2" targetFramework="net46" /> 
    <package id="Microsoft.Net.Compilers" version="2.1.0" targetFramework="net46" developmentDependency="true" /> 
    <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security.Facebook" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security.Google" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security.MicrosoftAccount" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Owin.Security.Twitter" version="3.0.1" targetFramework="net46" /> 
    <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" /> 
    <package id="Modernizr" version="2.6.2" targetFramework="net46" /> 
    <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net46" /> 
    <package id="Owin" version="1.0" targetFramework="net46" /> 
    <package id="Respond" version="1.2.0" targetFramework="net46" /> 
    <package id="Sammy.js" version="0.7.4" targetFramework="net46" /> 
    <package id="System.ComponentModel.EventBasedAsync" version="4.0.11" targetFramework="net46" /> 
    <package id="System.Dynamic.Runtime" version="4.0.0" targetFramework="net46" /> 
    <package id="System.Linq.Queryable" version="4.0.0" targetFramework="net46" /> 
    <package id="System.Net.Requests" version="4.0.11" targetFramework="net46" /> 
    <package id="System.Spatial" version="5.8.2" targetFramework="net46" /> 
    <package id="WebGrease" version="1.5.2" targetFramework="net46" /> 
    <package id="WindowsAzure.Storage" version="8.5.0" targetFramework="net46" /> 
</packages> 
+0

我已經在Github上發佈了我的項目.https://github.com/jayendranarumugam/MyProject – Jayendran

+0

我已經使用了密碼grant_type.So請使用以下access_token。{0} {0} {0} access_token「:」 qOErEnLSbDjQW8XaUnSEImDNRTe8WRVJHbqXEUQxJw4EiqHoybw4Jc4gBYJkClORNCprnPbJxJ0WGumBcq-i4TMom-HxOBGgYgneYbTUKw5zyrWSwTEdtPsfjNzzYxCtcwSj4a9tEEj_j8czKcrauM9lhJMHcx4p9jS-nWkAAZepvJKJx8fqQUZgyo4tjysDSpNJBTAsTMgw2Z8xZ3QXGW06OzYW2LeOkNUmFp0PWY2sj0Suykgz0G2Lw7KXBar7okFHLV9KtZPArAWsOfFAvi-c84y6TjqzZkZnU5n5jmAy_Z3A3j1Ahww7Kz4p-p6lu7dYFw」, 「token_type」: 「承載」 「expires_in」:60899, 「refresh_token」: 「a868cb78-4773-4fbf-888e-38a6b0a11700」 } – Jayendran

+0

我不能在我身邊運行你的應用程序。你能分享一個完整的應用程序嗎?此外,我發現你的Owin版本是2.1,我建議你可以更新到3.1,然後再試一次。 –