2016-11-11 101 views
1

在我努力创建使用Xamarin Forms中的HttpClient(SendAsync)上传视频的进度指示器时,现在我需要寻求帮助。自定义HttpContent不会构建 - 不可能AOT程序集(mtouch)

上传本身工作正常,所有其他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); 
//... 

的问题(S): 我不知何故导致错误?有一个更好的方法吗?

此标签与Xamarin.iOS也monotouch抱怨。

+1

您使用的是哪个版本的'Xamarin.iOS'?禁用增量构建帮助吗?结帐和链接的问题:https://bugzilla.xamarin.com/show_bug.cgi?id=43689 – SushiHangover

+0

@SushiHangover Xamarin.iOS ver。 10.2.0.4(Xamarin Indie),增量构建未启用。 – Mackan

回答

2

双击XS中的错误,它会将您带到提供关于该问题的更多描述的网页。例如。

MT3001无法AOT大会 '*'

这通常表示在AOT编译器的错误。请将错误 http://bugzilla.xamarin.com与一个可用于 的项目重现错误。

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

最主要约3001是,AOT编译器不产生输出二进制文件。这可能有几个原因。通常这个过程崩溃了,构建日志会给出更多细节的原因。

更重要的是将一个自包含的测试用例附加到bug报告。除了你粘贴的代码之外,别的东西可能是导致崩溃的一个重要部分(并且可能不可能重复或猜测该部分可能是什么)。这也给了我们一个更好的机会来提出解决问题的方法。

+0

我确实按照链接的第一件事,但我觉得这是一个非常“通用”的答案。我在这里发布的原因是为了了解这是否是http库的一个已知限制,或者如果我的代码是某种责任。我会尝试将它报告为一个错误,并希望我的问题可以产生一些替代方法。谢谢。 – Mackan

+0

是的,这是一个相当通用的答案,因为它是一个通用的错误代码(当AOT'ing时出错了)。你发布的内容只是冰山一角(错误),没有人(即使我们在Xamarin)也可以提供更准确的答案,而不需要我上面提出的问题。现在'MT3001'总是**错误,因为(即使您的代码存在问题),我们应该能够报告更好,准确的错误。 – poupou

+0

我明白了。只是我注意到一个小的FYI:该项目在模拟器(v10.1)上构建并运行良好,但在我的手机(v10.1.1)上运行良好。我会尝试完成自包含的测试用例,并在周末通过正确的渠道进行报告。 – Mackan

相关问题