我正在使用C#开发一个UWP应用程序,该应用程序使用Azure后端从Azure SQL数据库同步到本地设备SQLite数据库。自最初实施以来,这一点运作良好。
现在,我在尝试同步较大的图片时遇到了问题。小于~3MB的映像成功从StorageFile转换为byte [],并保存在SQLite数据库中并同步到Azure DB。但是,大于~3MB的图像会出现同步问题。它们将转换为byte []并正确显示,但尝试同步失败并出现此错误:
“HTTP请求不包含有效的实体主体。请确保请求中存在实体主体和关联的Content-Type标头。”
在服务器端,这表示格式错误。
所有图像的处理方式完全相同。 web.config文件已更改为允许requestLimits maxAllowedContentLength =“2147483648”。 Azure数据库中的列设置为varbinary(MAX)。
此代码调用将所选文件转换为byte []的方法:
byte[] image = await ImageUtils.ChooseImageFile();
以下是转换方法:
public static async Task<byte[]> ChooseImageFile()
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file == null)
return null;
byte[] bytes = null;
using (var stream = await file.OpenReadAsync())
{
bytes = new byte[stream.Size];
using (var reader = new DataReader(stream))
{
await reader.LoadAsync((uint)stream.Size);
reader.ReadBytes(bytes);
}
}
return bytes;
}
然后,调用方法将byte []分配给实体的Image属性 在同步时,我使用以下方法:
public async Task SyncOfflineCacheAsync()
{
try
{
await InitializeAsync();
await _client.SyncContext.PushAsync();
await PullTables();
}
catch (MobileServicePushFailedException ex)
{
if (ex.PushResult != null)
{
foreach (var error in ex.PushResult.Errors)
{
await ResolveConflictAsync(error);
}
}
}
}
在PushAsync()失败的地方出现上述错误。
是否存在某种以这种方式同步图像的隐式大小限制?我注意到byte []的字符串表示形式显示为较大图像的base64和较小图像的十六进制,但我找不到有关这是否与问题相关的任何信息。 byte []本身似乎是正确的。
谢谢!
答案 0 :(得分:0)
web.config文件已被更改为允许requestLimits maxAllowedContentLength =&#34; 2147483648&#34;。
maxAllowedContentLength
指定IIS支持的请求中的最大内容长度,而maxRequestLength
表示ASP.NET支持的最大请求大小,因此您需要设置两者以便上传大文件:较小的一个&#34;优先考虑&#34;。
maxRequestLength
的默认值为4096 KB(4 MB),因此您可能还需要设置此值。
<system.web>
<compilation debug="true" targetFramework="4.7"/>
<httpRuntime targetFramework="4.7" maxRequestLength="102400"/>
</system.web>
有关详细信息,请参阅this thread。