ユーザー ID に基づいてコンテナーを作成しようとしていますが、1 つのコンテナー内で 5 つの BLOB をテキスト ファイルとしてアップロードしたいと考えています。クライアント側は Windows アプリ (UWP) です。
ユーザー ID とテキスト ファイルはポスト リクエスト (webapi2) に送信され、ここからコンテナーが作成され、その中にファイルがアップロードされます。同時に、ワーカー ロールによって読み取られる必要がある Service Bus キューにコンテナー名が与えられます。
以下はクライアントコードです。
foreach (StorageFile file in files)
{
filesListView.Items.Add(file.DisplayName);
IInputStream inputStream = await file.OpenAsync(FileAccessMode.Read);
HttpMultipartFormDataContent multipartContent = new HttpMultipartFormDataContent();
//if (i == false)
//{
multipartContent.Add(new HttpStringContent(txtbox.Text), "myText");
i = true;
// }
multipartContent.Add(new HttpStreamContent(inputStream), "myFile", file.Name);
HttpClient client = new HttpClient();
Uri uri = new Uri("http://localhost:35095/api/upload");
HttpResponseMessage response = await client.PostAsync(uri,multipartContent);
}
post メソッドは次のとおりで、コンテナー名を Service Bus キューに送信する関数も含まれています。
foreach (HttpContent ctnt in prvdr.Contents)
{
// You would get hold of the inner memory stream here
Stream stream = ctnt.ReadAsStreamAsync().Result;
stream.Position = 0;
var type1 = ctnt.GetType();
if (ctnt.Headers.ContentDisposition.Name == "\"myFile\"")
{
var filename = ctnt.Headers.ContentDisposition.FileName;
var a = filename.Replace("\"", "");
CloudBlockBlob blob = imagesContainer.GetBlockBlobReference(a);
if (ctnt.Headers.ContentType != null)
{
// Set appropriate content type for your uploaded file
blob.Metadata["FileType"] = "Text";
blob.Properties.ContentType = ctnt.Headers.ContentType.MediaType;
}
// this.FileData.Add(new MultipartFileData(ctnt.Headers, blob.Name));
StreamReader rdr = new StreamReader(stream);
var a1 = rdr;
blob.UploadFromStream(stream);
}
else
{
string aaa = ctnt.Headers.ContentDisposition.ToString();
StreamReader rdr = new StreamReader(stream);
Container = rdr.ReadLine();
string z = Container;
imagesContainer = blobClient.GetContainerReference(z);
imagesContainer.CreateIfNotExists();
string msg = imagesContainer.Name;
sendMessage(msg);
}
}
});
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
public void sendMessage(String containerName)
{
// getting connection string from App setting
var connString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];
// creating service Bus
var namespaceManager = NamespaceManager.CreateFromConnectionString(connString);
if (!namespaceManager.QueueExists("testqueue"))
{
namespaceManager.CreateQueue("testqueue");
}
// creating service bus client
QueueClient clnt = QueueClient.CreateFromConnectionString(connString, "TestQueue");
string msg = containerName;
BrokeredMessage message = new BrokeredMessage(msg);
clnt.Send(message);
コンテナーの作成、テキスト ファイルのアップロード、コンテナー名の Service Bus キューへの渡しに成功しました。
問題は次のとおりです。
- クライアント側からは 2 つのデータ (コンテナー、つまりユーザー ID とそれに対応する 5 つのテキスト ファイル) が渡されるため、else 部分が 5 回実行されます。
- そのため、5 つのメッセージ (同じコンテナー) がサービス バス キューに送信されます。
- キューに送信する必要があるメッセージは 1 つだけです。つまり、コンテナ名です。
どんな助けでも親切に感謝します。私は Azure を初めて使用します。