Удалить объект в корзине, 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 являются строками. Может ли кто-нибудь помочь мне понять, где я иду не так?
Большое спасибо.
2 ответа
На этой неделе мне довелось написать рабочий код для одного участника в 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, добавить его в ваш проект и отладить соответствующие методы, чтобы увидеть точную ошибку. Пожалуйста, дайте нам знать, если у вас есть какие-либо вопросы по этому вопросу.
Сторона сервера:
[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);
}
});
}
URL должен быть URL: "/api/forge/oss/objects/delete" вместо URL: "api / forge / oss / objects / delete"