0

ユーザー 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 キューへの渡しに成功しました。

問題は次のとおりです。

  1. クライアント側からは 2 つのデータ (コンテナー、つまりユーザー ID とそれに対応する 5 つのテキスト ファイル) が渡されるため、else 部分が 5 回実行されます。
  2. そのため、5 つのメッセージ (同じコンテナー) がサービス バス キューに送信されます。
  3. キューに送信する必要があるメッセージは 1 つだけです。つまり、コンテナ名です。

どんな助けでも親切に感謝します。私は Azure を初めて使用します。

4

0 に答える 0