2014-06-15 5 views
6

मैं एक बहुत ही सरल सेवा,समानांतर ब्लॉब अपलोड फेंकने 404 गलत अनुरोध रुक-रुक कर

public class AzureService : IAzureService 
{ 
    private readonly CloudBlobContainer _container; 
    public AzureService(ISettings settings) 
    { 
     var storageAccount = CloudStorageAccount.Parse(settings.BlobConnectionString);    
     var blobClient = storageAccount.CreateCloudBlobClient(); 
     _container = blobClient.GetContainerReference(settings.BlobContainerName); 
    } 

    public Task UploadBlobAsync(string fileName, Stream stream) 
    { 
     var blob = _container.GetBlockBlobReference(fileName); 
     return blob.UploadFromStreamAsync(stream); 
    } 

    public Task DeleteBlobAsync(string fileName) 
    { 
     var blob = _container.GetBlockBlobReference(fileName); 
     return blob.DeleteAsync(); 
    } 
} 

इस विधि से कहा जाता है,

public Task SaveAllAsync(Dictionary<string, Stream> images) 
    { 
     var tasks = new List<Task>(); 
     foreach (var image in images) 
     { 
      var fileName = image.Key; 
      var stream = image.Value; 
      var task = _azureService.UploadBlobAsync(fileName, stream); 
      tasks.Add(task); 
     } 
     return Task.WhenAll(tasks); 
    } 

मेरे धारा HttpPostedFileBase.InputStream है। कभी-कभी यह काम करता है और कभी-कभी मुझे The remote server returned an error: (400) Bad Request. मिलता है। यदि मैं ब्रेक-पॉइंट डालता हूं तो यह भी काम करता है।

+0

400 निश्चित रूप से एक सर्वर कह ग्राहक एक गलत अनुरोध भेजा गया त्रुटि है। अच्छे और बुरे अनुरोधों के बीच क्या अंतर है यह देखने के लिए फिडलर का उपयोग करने का प्रयास करें। –

+0

@PauloMorgado, अगर मैं uploadFromStreamAsync' का इंतजार कर रहा हूं तो यह – user960567

+0

काम करेगा 'अपलोडफ्रेमस्ट्रीमएसिंक' का कोई प्रभाव नहीं होना चाहिए। क्या आपने फिडलर के साथ HTTP सामग्री की जांच की है? –

उत्तर

1

मैं एक ही समस्या थी, मैं, 1 हड़ताल में 20 + छवियों को अपलोड करने की कोशिश की एक लड़ी काम करता है, बहु लड़ी await Task.WhenAll के साथ "दूरस्थ सर्वर ने एक त्रुटि दी विफल रहा है का उपयोग करते हुए: (400) गलत अनुरोध। "

  • RequestInformationMicrosoft.WindowsAzure.Storage.StorageException अंदर जो अपलोड से फेंक दिया जाता है देखने [XXX] और विस्तृत जानकारी के लिए Async तरीकों।

  • सबसे पहले, RequestInformation ने कहा, "Md5Mismatch" की त्रुटि कोड के साथ एक MD5 समस्या के बारे में कुछ खरीदने, मेरे अंतर्ज्ञान अन्यथा कहा क्योंकि एकल थ्रेड एक आकर्षण की तरह काम करता है, और फिर .. मुझे मिल गया ... DefaultRequestOptions.ParallelOperationThreadCount पर CloudBlobClient ऑब्जेक्ट और समस्या sovled।

  • BlobRequestOptions Members MSDN


private CloudBlobContainer ConnectToImageContainer() 
    { 
     var credentials = new StorageCredentials(AccountName, ImagesContainerKey); 
     var account = new CloudStorageAccount(credentials, useHttps: true); 
     var client = account.CreateCloudBlobClient(); 
     client.DefaultRequestOptions.ParallelOperationThreadCount = 64; // max value 
     client.DefaultRequestOptions.SingleBlobUploadThresholdInBytes = 67108864; // max value 
     var container = client.GetContainerReference(ImagesContainerName); 
     return container; 
    } 
0

जो व्यवहार आप वर्णन कर रहे हैं वह थ्रेडिंग समस्या की तरह बहुत अधिक लगता है (यानी यदि आप कोड को तोड़ते हैं तो यह ठीक काम करता है क्योंकि यह उस समय प्रभावी रूप से सिंगल-थ्रेडेड होता है) जिसके परिणामस्वरूप अपूर्ण या अमान्य डेटा Azure Storage API को भेजा जा रहा है।

आपकी "var image" परिभाषा बहु-थ्रेडेड वातावरण में अप्रत्याशित रूप से व्यवहार कर सकती है (यदि आपने रीशेपर का उपयोग किया है तो यह इस चर को हाइलाइट करेगा और कोड को बदलने की सलाह देगा क्योंकि यह संभावित रूप से असुरक्षित है)।

थोड़ा और समझने के लिए और आप अपने कोड को बेहतर तरीके से कैसे कार्यान्वित कर सकते हैं, इस SO पोस्ट को पढ़ लें।

The foreach identifier and closures

संबंधित मुद्दे