使用Azure移动应用程序的UWP应用程序后端脱机数据同步问题

时间:2018-03-06 20:38:00

标签: c# azure uwp synchronization

我正在使用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 []本身似乎是正确的。

谢谢!

1 个答案:

答案 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