Удалить объект в корзине, C # ASP.NET

Я пытаюсь удалить объект из ведра. Чтение документации звучит очень просто, но я просто не могу заставить это работать. На стороне сервера у меня в ASP.NET следующее:

[HttpDelete]
[Route("api/forge/oss/objects/delete")]
public async Task<dynamic> DeleteObject_fromBucket()
{
    // basic input validation
    HttpRequest req = HttpContext.Current.Request;

    if (string.IsNullOrWhiteSpace(req.Params["bucketKey"]))
        throw new System.Exception("BucketKey parameter was not provided.");

    if (string.IsNullOrWhiteSpace(req.Params["objectName"]))
        throw new System.Exception("ObjectName parameter was not provided."); 

    string bucketKey = req.Params["bucketKey"];
    string objectName = req.Params["objectName"];

    // call API to delete object on the bucket
    dynamic oauth = await OAuthController.GetInternalAsync();
    ObjectsApi objects = new ObjectsApi();
    string access_token = oauth.access_token; ;
    objects.Configuration.AccessToken = access_token;

    // delete the file/object
    await objects.DeleteObjectAsync(bucketKey, objectName);
    return 0;
}

На стороне клиента:

function deleteObject(node) {
    result = window.confirm('Wollen Sie dieses Modell löschen');
    if (result == false) { return; }
    else {
        var bucketKey = node.parents[0];
        var objectName = node.text;

        var formData = new FormData();
        formData.append('bucketKey', bucketKey);
        formData.append('objectName', objectName);

        $.ajax({
            url: 'api/forge/oss/objects/delete',
            data: formData,
            contentType: false,  
            processData: false,
            type: 'DELETE',  // man könnte auch method: schreiben
            success: function (data) {
                $('#appBuckets').jstree(true).refresh_node(node);
            }
        });
    }       
}

Я всегда получаю исключение, что он не может вызвать API. BucketKey и objectName являются строками. Может ли кто-нибудь помочь мне понять, где я ошибаюсь?

Большое спасибо.


person dabuchera    schedule 13.07.2018    source источник
comment
Где выбрасывается исключение?   -  person PepitoSh    schedule 13.07.2018
comment
Во время выполнения функции: await objects.DeleteObjectAsync (bucketKey, objectName);   -  person dabuchera    schedule 13.07.2018
comment
И что именно является исключением?   -  person PepitoSh    schedule 13.07.2018
comment
Autodesk.Forge.Client.ApiException: // Выбрасывается, когда не удается выполнить вызов API   -  person dabuchera    schedule 13.07.2018
comment
Я думаю, что используемый вами объект oauth недействителен. Также объекты пусты, когда вы пытаетесь удалить из него.   -  person PepitoSh    schedule 13.07.2018
comment
Вы были правы. Мне пришлось добавить к токену еще одну область видимости. Тогда это работает. Спасибо   -  person dabuchera    schedule 13.07.2018


Ответы (2)


URL-адрес должен быть url: '/ api / forge / oss / objects / delete' вместо url: 'api / forge / oss / objects / delete'

person ravichandra vydhya    schedule 13.07.2018
comment
Не обязательно. Если приложение не находится в корне домена, ваше предложение не будет выполнено. Если он есть, то никакой разницы не будет. - person PepitoSh; 13.07.2018

На этой неделе мне довелось написать рабочий код для одного участника Sydney Accelerator. Фрагмент кода протестирован в учебном пособии Learn Forge (двухсторонний рабочий процесс) . Один удаляет корзину, другой удаляет объект. Похоже, вы тоже тестируете этот скелет учебника?

Вначале я сделал похожий код, похожий на ваш, но мой VS выдает ошибку при компиляции. Наконец, я обнаружил, что это связано с возвращаемым значением. Поскольку это HTTP-запрос, кажется, что 0 не имеет смысла для ответа. Кроме того, область действия внутреннего токена по умолчанию в этом руководстве не содержит удаления корзины и записи данных (для удаления объекта). Я получил детальную ошибку с ответом со стороны клиента.

После добавления этих областей в OAuthController.cs. Все заработало:

 public static async Task<dynamic> GetInternalAsync()
 {
  if (InternalToken == null || InternalToken.ExpiresAt < 
   DateTime.UtcNow)
  {
    InternalToken = await Get2LeggedTokenAsync(new Scope[] { 
       Scope.BucketCreate, Scope.BucketRead, Scope.DataRead, 
       Scope.DataCreate,Scope.BucketDelete,Scope.DataWrite});
        InternalToken.ExpiresAt = 
    DateTime.UtcNow.AddSeconds(InternalToken.expires_in);
  }

  return InternalToken;
}

Если они вам не помогут, я бы предложил создать исходный код Forge SDK project, добавив в свой проект и отладив соответствующие методы, чтобы узнать, в чем именно заключается ошибка. Пожалуйста, дайте нам знать, если у вас возникнут какие-либо вопросы по этому поводу.

На стороне сервера:

    [HttpPost]
    [Route("api/forge/oss/buckets/delete")]
    public async Task<dynamic> DeleteBucket([FromBody]CreateBucketModel bucket)
    {
        BucketsApi buckets = new BucketsApi();
        dynamic token = await OAuthController.GetInternalAsync();
        buckets.Configuration.AccessToken = token.access_token; 

        await buckets.DeleteBucketAsync(bucket.bucketKey); 
        //or
        //buckets.DeleteBucket(bucket.bucketKey); 

        return Task.CompletedTask;
    }

    [HttpPost]
    [Route("api/forge/oss/objects/delete")]
    public async Task<dynamic> DeleteObject([FromBody]DeleteObjectModel 
                                                      objInfo)
    {
        ObjectsApi objs = new ObjectsApi();
        dynamic token = await OAuthController.GetInternalAsync();
        objs.Configuration.AccessToken = token.access_token;

        await objs.DeleteObjectAsync(objInfo.bucketKey, objInfo.objectKey);

        //or
        //objs.DeleteObject(objInfo.bucketKey, objInfo.objectKey); 

        return Task.CompletedTask;
    }

    public class CreateBucketModel
    {
      public string bucketKey { get; set; }
    }

    public class DeleteObjectModel
    {
       public string bucketKey { get; set; }
       public string objectKey { get; set; } 
     }

Клиентская сторона:

function deleteBucket() {
     //select one bucket node of the tree
     var bucketKey = $('#appBuckets').jstree(true).get_selected(true)[0].id;

     var policyKey = $('#newBucketPolicyKey').val();
     jQuery.post({
        url: '/api/forge/oss/buckets/delete',
             contentType: 'application/json',
             data: JSON.stringify({ 'bucketKey': bucketKey, 
                                    'policyKey': policyKey }),
             success: function (res) {
               $('#appBuckets').jstree(true).refresh();
               alert('Bucket  deleted') 
              },
             error: function (err) {
               alert('Bucket not deleted')
               console.log(err);
             }
         });
     }

   function deleteObject() {
      //assume the first selected tree node is bucket
      var bucketKey = $('#appBuckets').jstree(true).get_selected(true)[0].text;
      //assume the second selected tree node is object
      var objectKey = $('#appBuckets').jstree(true).get_selected(true)[1].text;
      jQuery.post({
          url: '/api/forge/oss/objects/delete',
          contentType: 'application/json',
          data: JSON.stringify({ 'bucketKey': bucketKey, 
                                 'objectKey': objectKey }),
          success: function (res) {
             $('#appBuckets').jstree(true).refresh();
             alert('Object  deleted') 
          },
          error: function (err) {
            alert('Object not deleted')
            console.log(err);
          }
      });
 }
person Xiaodong Liang    schedule 14.07.2018