我努力创建一个使用Xamarin Forms中的HttpClient(SendAsync)上传视频的进度指示器,我现在不得不寻求帮助。
上传本身工作正常,以及所有其他API调用,但当我尝试创建自定义HttpContent
来跟踪上传进度时,项目甚至不再构建。
错误MT3001:无法对装配进行AOT操作 '[...]的iOS / OBJ / iPhone /调试/集结iphone7.2-10.1.1 / mTouch触摸缓存/编译/ theproject.dll' (MT3001)(theproject.iOS)
使用StreamContent或ByteArrayContent代替项目构建,但我无法让它跟踪进度。
一段代码(这是最小的例子):
public class ProgressableContent : HttpContent
{
private const int defaultBufferSize = 4096;
private Stream content;
private int progress;
public ProgressableContent(Stream content)
{
this.content = content;
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
return Task.Run(async () =>
{
var buffer = new byte[defaultBufferSize];
var size = content.Length;
var uploaded = 0;
using (content) while (true)
{
var length = content.Read(buffer, 0, buffer.Length);
if (length <= 0) break;
uploaded += length;
progress = (int)((float)uploaded / size * 100);
await stream.WriteAsync(buffer, 0, length);
}
});
}
protected override bool TryComputeLength(out long length)
{
length = content.Length;
return true;
}
}
我通过将我的字节转换为流来使用它,希望正确:
//... building httpMessage.
httpMessage.Content = new ProgressableContent(await byteArrayContent.ReadAsStreamAsync());
//...
var response = await _httpClient.SendAsync(httpMessage, Cancellation.Token);
//...
问题: 我是以某种方式导致错误?有没有“更好”的方法来做到这一点?
使用Xamarin.iOS对此进行了标记,因为monotouch正在抱怨。
答案 0 :(得分:2)
双击XS中的错误,它会带您进入一个网页,提供有关该问题的更多说明。 E.g。
MT3001无法对装配体进行'*'
这通常表示AOT编译器中存在错误。请提交一个错误 http://bugzilla.xamarin.com有一个可以用来的项目 重现错误。
有时候可以通过禁用增量来解决这个问题 在项目的iOS Build选项中构建(但它仍然是一个bug,所以 请反正报告。)
关于3001
的主要问题是AOT编译器没有生成输出二进制文件。这可能有几个原因。通常,进程崩溃,构建日志将提供更多详细信息。
更重要的是将自包含的测试用例附加到错误报告中。除了粘贴的代码之外,还有其他一些东西可以起到导致崩溃的重要部分(并且可能无法复制或猜测该部分可能是什么)。这也为我们提供了一个更好的机会来建议解决问题的方法。