2011-10-11 52 views
1

我有一部分代碼用於將文本上傳到Azure blob存儲。它使用CloudBlobClient.GetContainerReference().GetBlobReference().UploadText()無法從ASP.NET MVC內部寫入blob存儲

string connectionString = RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"); 
CloudStorageAccount account = CloudStorageAccount.Parse(connectionString); 
CloudBlobClient blobClient = account.CreateCloudBlobClient(); 
CloudBlobContainer container = client.GetContainerReference(containerName); 
container.CreateIfNotExist(); 
DateTime currentTime = DateTime.UtcNow; 
String instanceId = RoleEnvironment.CurrentRoleInstance.Id; 
int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId; 
String blobPath = String.Format("error-{0}-{1}-{2}", currentTime.Ticks, instanceId, threadId); 
container.GetBlobReference(blobPath).UploadText(textToUpload); 

到目前爲止代碼工作正常。現在,我將該代碼的調用添加到ASP.NET MVC2應用程序的各個位置以調試後者,並且代碼默默無聞 - 沒有例外,沒有新的Blob,也沒有任何內容。如果我試圖獲得

String justUploaded = container.GetBlobReference(blobPath).DownloadText(textToUpload); 

之後並在網頁上發佈結果 - 沒有異常,並且字符串爲空。如果我試圖獲得

String uri = container.GetBlobReference(blobPath).Uri.ToString(); 

再次沒有例外,字符串是空的。

與包含MVC應用程序的相同Web角色的OnStart()中的上傳代碼完全相同。

寫入Blob存儲不能正常工作的可能原因是什麼?我該如何解決這個問題?

+0

您是否在Global.asax Application_Start事件處理程序中調用了Microsoft.WindowsAzure.CloudStorageAccount.SetConfigurationSettingPublisher方法? –

+0

@Yuriy Rozhovetskiy:現在我確實有,但它沒有幫助。 – sharptooth

+0

你是如何創建CloudStorageAccount實例的? –

回答

0

好的,問題已解決。現在有點豐田Five Whys。

Q爲什麼不文本被上傳到Blob存儲?
A它不會因爲上面的代碼沒有被調用。

Q爲什麼代碼不被調用?
這不是因爲其invokation是依賴於使用反射來檢測是否Microsoft.WindowsAzure.ServiceRuntime裝入當前應用程序域鬆耦合代碼。程序集沒有加載,所以代碼甚至不會嘗試訪問blob存儲,並會回落到「我不在Azure」模式。

QWTF ???你之前沒有測試過這個代碼嗎?
A我測試了它,但沒有在MVC應用程序中,看起來像MVC應用程序中的行爲與MVC應用程序中的行爲不同。程序集在我之前測試的配置中加載。

Q如何強制加載程序集?
A不確定,但看起來像在<system.web><compilation><assemblies>下添加它解決了這個問題。 Here's a question specifically about that.