2014-01-22 85 views
0

我的应用程序显示需要下载授权http头的图像。因此,我创建了一个自定义控件AuthenticatedImage,该控件创建了具有必要标题的HttpClient,下载图像流并设置控制模板的控制源Image自定义控件从下载流设置图像源

打电话时bitmapImage.SetSource(stream)我做错了什么与线程似乎因为我得到这个异常:

A first chance exception of type 'System.NotSupportedException' occurred in System.Windows.ni.dll 

Additional information: Read is not supported on the main thread when buffering is disabled. 

这是我的自定义控件的简化相关方法:

public override async void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 

    this.image = GetTemplateChild(imagePartName) as Image; 

    await this.SetSource(this.Source); 
} 

private async Task SetSource(Uri uri) 
{ 
    var stream = await DownloadImage(uri); 

    var bitmapImage = new BitmapImage(); 
    bitmapImage.SetSource(stream); 
    this.image.Source = bitmapImage; 
} 

private Task<Stream> DownloadImage(Uri uri) 
{ 
    var httpClientHandler = new HttpClientHandler(); 
    var httpClient = new HttpClient(httpClientHandler); 

    httpClient.DefaultRequestHeaders.Add(/* custom header */); 

    return httpClient.GetStreamAsync(uri); 
} 

我寻找这样做的正确方法。

+0

您是否使用post方法? – Jaihind

+0

不,我正在下载一个图像,并使用GetStreamAsync,如你所见。 – siger

回答

0

我通过使用带特定HttpCompletionOption而不是GetStreamAsync的GetAsync工作。

httpClient.GetAsync(uri, HttpCompletionOption.ResponseContentRead);

同样的问题发生,如果我用HttpCompletionOption.ResponseHeaderRead,所以我认为它有没有被响应完全可以由当时的任务返回做的,它是GetStreamAsync的行为。

0

附加fllow代码:

Dispatcher.BeginInvoke(()=> {#SET图像源算子与您的代码#});

交叉线程运算符异常。

+0

我通过在发布的内容中包装我的'bitmapImage.SetSource(stream)'行来得到相同的异常。 – siger

+0

你可以在这里发布你的代码吗? –

0

这是一种不同的方法。我用了很多次,可能这会帮助你。

private Task<Stream> DownloadImage(string uri) 
    { 
     HttpWebRequest imageRequest = HttpWebRequest.CreateHttp(uri); 
    imageRequest.Headers["Your Header key"] = header value; 
    imageRequest.BeginGetResponse(Imageresponse, imageRequest); 

    } 


    private void Imageresponse(IAsyncResult asyncResult) 
      { 
       try 
       { 
        HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 
        using (Stream data = response.GetResponseStream()) 
        { 
         using (MemoryStream memoryStream = new MemoryStream()) 
         { 
          data.CopyTo(memoryStream); 
          memoryStream.Position = 0; 
          byte[] buffer = null; 
          if (memoryStream != null && memoryStream.Length > 0) 
          { 
           BinaryReader binaryReader = new BinaryReader(memoryStream); 
           buffer = binaryReader.ReadBytes((int)memoryStream.Length); 
           Stream stream = new MemoryStream(); 
           stream.Write(buffer, 0, buffer.Length); 
           stream.Seek(0, SeekOrigin.Begin); 
           Dispatcher.BeginInvoke(() => 
           { 
            BitmapImage bitmapImage = new BitmapImage { CreateOptions = BitmapCreateOptions.None }; 
            bitmapImage.SetSource(stream); 
            this.image.Source = bitmapImage; 
           }); 
          } 

         } 
        } 
       } 
       catch (Exception ex) 
       { 
        ExceptionHelper.WriteLog(ex); 
       } 

      }