Не удается записать в хранилище BLOB-объектов изнутри ASP.NET MVC - PullRequest
1 голос
/ 11 октября 2011

У меня есть часть кода для загрузки текста в хранилище BLOB-объектов Azure.Он использует CloudBlobClient.GetContainerReference().GetBlobReference().UploadText().

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 для отладки последнего, и код молча ничего не делает - ни исключений, ни новых больших двоичных объектов, ни чего-либо.Если я попытаюсь получить

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

сразу после этого и опубликовать результат на веб-странице - не будет никаких исключений, и строка будет пустой.Если я попытаюсь снова получить

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

, исключений не будет, и строка будет пустой.

Тот же код загрузки работает нормально изнутри OnStart() той же веб-роли, которая содержитПриложение MVC.

Какова вероятная причина того, что запись в хранилище больших двоичных объектов не работает?Как мне решить эту проблему?

1 Ответ

0 голосов
/ 12 октября 2011

Хорошо, проблема решена.Теперь немного о Toyota Five Whys.

Q Почему текст не будет загружен в хранилище BLOB-объектов?
A Не будет, потому что приведенный выше код не был вызван.

Q Почему этот код не был вызван?
A Это произошло не потому, что его вызов зависел от кода слабой связи, который использовал Reflection для определения, был ли загружен Microsoft.WindowsAzure.ServiceRuntime в текущий домен приложения.Сборка не была загружена, поэтому код даже не пытается получить доступ к хранилищу больших двоичных объектов и возвращается в режим «Я не в Azure».

Q WTF ???Разве вы не тестировали этот код ранее?
A Я тестировал его, но не в приложении MVC, и похоже, что поведение в приложении MVC отличается от того, что нев приложении MVC.Сборка была загружена в конфигурации, которую я тестировал ранее.

Q Как принудительно загрузить сборку?
A Не уверен, но похоже, что добавление его в <system.web><compilation><assemblies> решает проблему. Вот вопрос конкретно об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...