自定义HttpContent不会构建 - 无法AOT组件(mtouch)

时间:2016-11-11 12:35:49

标签: xamarin xamarin.ios xamarin.forms httpcontent

我努力创建一个使用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正在抱怨。

1 个答案:

答案 0 :(得分:2)

双击XS中的错误,它会带您进入一个网页,提供有关该问题的更多说明。 E.g。

MT3001无法对装配体进行'*'

  

这通常表示AOT编译器中存在错误。请提交一个错误   http://bugzilla.xamarin.com有一个可以用来的项目   重现错误。

     

有时候可以通过禁用增量来解决这个问题   在项目的iOS Build选项中构建(但它仍然是一个bug,所以   请反正报告。)

关于3001的主要问题是AOT编译器没有生成输出二进制文件。这可能有几个原因。通常,进程崩溃,构建日志将提供更多详细信息。

更重要的是将自包含的测试用例附加到错误报告中。除了粘贴的代码之外,还有其他一些东西可以起到导致崩溃的重要部分(并且可能无法复制或猜测该部分可能是什么)。这也为我们提供了一个更好的机会来建议解决问题的方法。