Загрузка dwg в ​​Forge - PullRequest
0 голосов
/ 19 марта 2019

Я нахожусь в процессе изучения платформы Forge.В настоящее время я использую пример (Jigsawify), написанный Кином Уолмсли, потому что он наиболее точно описывает мои цели.У меня проблема с загрузкой файла из учетной записи хранилища Azure в Forge.Я получаю сообщение об ошибке: «Значение одного из заголовков HTTP не в правильном формате».Мой вопрос: как кто-то решает проблему с протоколом HTTP при написании, в данном случае, рабочего элемента в коде?Я могу поставить точку останова для просмотра рабочего элемента, но я недостаточно разбираюсь в том, чтобы понять, где находится недостаток в заголовке HTTP или даже где его найти.Есть ли конкретное свойство рабочего элемента, на которое я должен обратить внимание?Если бы я мог найти оператор HTTP, я бы мог проверить его, но я не могу найти его там, где я должен его найти.

Или я просто совершенно не в себе?

В любом случае, вот код.Это модифицированная версия того, что написал Кин:

static void SubmitWorkItem(Activity activity)
    {
      Console.WriteLine("Submitting workitem...");

            CloudStorageAccount storageAccount =
                    CloudStorageAccount.Parse(Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
        StorageCredentials crd = storageAccount.Credentials;

        CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
        CloudFileShare ShareRef = fileClient.GetShareReference("000scrub");
        CloudFileDirectory rootDir = ShareRef.GetRootDirectoryReference();
        CloudFile Fileshare = rootDir.GetFileReference("3359fort.dwg");


    // Create a workitem

    var wi = new WorkItem()
    {
        Id = "", // Must be set to empty
        Arguments = new Arguments(),
        ActivityId = activity.Id
    };


    if (Fileshare.Exists())
    {
        wi.Arguments.InputArguments.Add(new Argument()
        {
            Name = "HostDwg", // Must match the input parameter in activity
            Resource = Fileshare.Uri.ToString(),
            StorageProvider = StorageProvider.Generic // Generic HTTP download (vs A360)
        });
    }

    wi.Arguments.OutputArguments.Add(new Argument()

    {
        Name = "Results", // Must match the output parameter in activity
        StorageProvider = StorageProvider.Generic, // Generic HTTP upload (vs A360)
        HttpVerb = HttpVerbType.POST, // Use HTTP POST when delivering result
        Resource = null, // Use storage provided by AutoCAD.IO
        ResourceKind = ResourceKind.ZipPackage // Upload as zip to output dir

    });

      container.AddToWorkItems(wi);
      container.SaveChanges();

      // Polling loop

      do
      {
        Console.WriteLine("Sleeping for 2 sec...");
        System.Threading.Thread.Sleep(2000);
        container.LoadProperty(wi, "Status"); // HTTP request is made here
        Console.WriteLine("WorkItem status: {0}", wi.Status);
      }
      while (
        wi.Status == ExecutionStatus.Pending ||
        wi.Status == ExecutionStatus.InProgress
      );

      // Re-query the service so that we can look at the details provided
      // by the service

      container.MergeOption =
        Microsoft.OData.Client.MergeOption.OverwriteChanges;
      wi = container.WorkItems.ByKey(wi.Id).GetValue();

      // Resource property of the output argument "Results" will have
      // the output url

      var url =
        wi.Arguments.OutputArguments.First(
          a => a.Name == "Results"
        ).Resource;

      if (url != null)
        DownloadToDocs(url, "SGA.zip");

      // Download the status report

      url = wi.StatusDetails.Report;

      if (url != null)
        DownloadToDocs(url, "SGA-Report.txt");
    }

Любая помощь приветствуется, Чак

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Итак, я смог выяснить, как загрузить мой файл из Azure в Forge, используя предложение Альберта о переходе на службу BLOB-объектов. Вот код:

static void SubmitWorkItem(Activity activity)
    {
        Console.WriteLine("Submitting workitem...");

        CloudStorageAccount storageAccount =
            CloudStorageAccount.Parse(Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));

        CloudBlobClient BlobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer cloudBlobContainer = BlobClient.GetContainerReference("000scrub");
        CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference("3359fort.dwg");

            // Create a workitem

            var wi = new WorkItem()
    {
        Id = "", // Must be set to empty
        Arguments = new Arguments(),
        ActivityId = activity.Id
    };


    if (blockBlob.Exists())
    {
        wi.Arguments.InputArguments.Add(new Argument()
        {
            Name = "HostDwg", // Must match the input parameter in activity
            Resource = blockBlob.Uri.ToString(),
            StorageProvider = StorageProvider.Generic, // Generic HTTP download (vs A360)
            Headers = new System.Collections.ObjectModel.ObservableCollection<Header>()
                {
                    new Header() { Name = "x-ms-blob-type", Value = "BlockBlob" } // This is required for Azure.
                }

        });
    }

    wi.Arguments.OutputArguments.Add(new Argument()

    {
        Name = "Results", // Must match the output parameter in activity
        StorageProvider = StorageProvider.Generic, // Generic HTTP upload (vs A360)
        HttpVerb = HttpVerbType.POST, // Use HTTP POST when delivering result
        Resource = null, // Use storage provided by AutoCAD.IO
        ResourceKind = ResourceKind.ZipPackage, // Upload as zip to output dir 

    });

      container.AddToWorkItems(wi);
      container.SaveChanges();

      // Polling loop

      do
      {
        Console.WriteLine("Sleeping for 2 sec...");
        System.Threading.Thread.Sleep(2000);
        container.LoadProperty(wi, "Status"); // HTTP request is made here
        Console.WriteLine("WorkItem status: {0}", wi.Status);
      }
      while (
        wi.Status == ExecutionStatus.Pending ||
        wi.Status == ExecutionStatus.InProgress
      );

      // Re-query the service so that we can look at the details provided
      // by the service

      container.MergeOption =
        Microsoft.OData.Client.MergeOption.OverwriteChanges;
      wi = container.WorkItems.ByKey(wi.Id).GetValue();

      // Resource property of the output argument "Results" will have
      // the output url

      var url =
        wi.Arguments.OutputArguments.First(
          a => a.Name == "Results"
        ).Resource;

      if (url != null)
        DownloadToDocs(url, "SGA.zip");

      // Download the status report

      url = wi.StatusDetails.Report;

      if (url != null)
        DownloadToDocs(url, "SGA-Report.txt");
    }

Что еще не завершено, так это раздел результатов. В ZIP нет ничего, но эй, детка, правильно?

Спасибо, Альберт. -Chuck

0 голосов
/ 19 марта 2019

Azure требует, чтобы вы указали заголовок x-ms-blob-type при загрузке на предварительно назначенный URL-адрес. Смотри https://github.com/Autodesk-Forge/design.automation-.net-input.output.sample/blob/master/Program.cs#L167

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