[英]MobileServiceInvalidOperationException: The request could not be completed. (Bad Request) on save images
我正在做一个使用Android客户端和Mobile Azure Service应用程序的POC应用程序。
我设法实现了一个解决方案,该方案利用Sql Server Compact 4.0数据库文件来存储一些文本和小图像(每个计划最大300 Kb)。
但是,它仅适用于非常小的图像(例如2 Kb),这些图像也以Jpeg格式压缩,质量最低
(使用此: image.Compress(Bitmap.CompressFormat.Jpeg, 0, stream);
)。
当尝试使用应用程序保存项目时,出现较大图像时,我确实收到“ Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:请求无法完成。(错误请求) ”错误。 我没有在响应中找到任何关于请求长度限制的确切提及,我认为是这样。
所以我的问题是-Azure存储是完成此任务的唯一方法吗? (同样,不确定使用Azure存储的任何免费选项) 。
带有内容上传的UI部分(我正在使用Xamarin)
选择要上传的图片(放入_currentImage变量):
protected override void OnActivityResult(int requestCode, Result result, Intent data)
{
base.OnActivityResult(requestCode, result, data);
if (requestCode == 1)
{
if (result == Result.Ok)
{
var selectedImage = data.Data;
var filePath = GetPathToImage(selectedImage);
var photo = BitmapFactory.DecodeFile(filePath);
_currentImage = photo;
ImagePreview.SetImageBitmap(photo);
}
}
}
保存调用Azure移动应用程序的内容:
private async void UploadItemContent()
{
using (MobileServiceClient client = new MobileServiceClient(Configuration.Urls.CloudAppUrl))
{
var table = client.GetTable<Item>();
var content = ContentDescriptionEditText.Text;
var header = ContentHeaderEditText.Text;
var stream = new MemoryStream();
_currentImage.Compress(Bitmap.CompressFormat.Jpeg, 0, stream);
var bitmapData = stream.ToArray();
var item = new Item
{
Content = content,
Header = header,
Image = bitmapData,
CreationDate = DateTime.Now.ToUniversalTime()
};
try
{
await table.InsertAsync(item);
ShowSuccessStatus();
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
}
后端
项目定义到Azure移动服务中:
public class Item : ITableData
{
public Item()
{
}
[Key]
[TableColumn(TableColumnType.Id)]
public string Id { get; set; }
public string Header { get; set; }
public string Content { get; set; }
[Column(TypeName = "image")]
public byte[] Image { get; set; }
public DateTime? CreationDate { get; set; }
public DateTime? UpdateDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Index(IsClustered = true)]
[TableColumn(TableColumnType.CreatedAt)]
public DateTime? CreatedAt { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[TableColumn(TableColumnType.UpdatedAt)]
public DateTime? UpdatedAt { get; set; }
[TableColumn(TableColumnType.Deleted)]
public bool Deleted { get; set; }
[TableColumn(TableColumnType.Version)]
[Timestamp]
public byte[] Version { get; set; }
[NotMapped]
DateTimeOffset? ITableData.CreatedAt
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
[NotMapped]
DateTimeOffset? ITableData.UpdatedAt
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
}
将ItemController插入Azure移动服务:
public class ItemController : TableController<Item>
{
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
MobileServiceContext context = new MobileServiceContext();
DomainManager = new EntityDomainManager<Item>(context, Request);
}
...
}
您需要为此使用Azure存储。 在这里查看我的书中的食谱: https : //adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter4/recipes/
Azure存储没有免费选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.