C# 如何从Windows.Web.Http使用新的HttpClient下载映像?

C# 如何从Windows.Web.Http使用新的HttpClient下载映像?,c#,windows-phone,windows-phone-8.1,windows-8.1,portable-class-library,C#,Windows Phone,Windows Phone 8.1,Windows 8.1,Portable Class Library,使用Windows.Web.Http.HttpClient如何下载图像?我想使用这个HttpClient,因为它可以在可移植类库中使用。这就是我最终想到的。关于Windows.Web.Http.HttpClient并没有太多文档,很多在线示例都使用了诸如ReadAllByteAsync之类的旧机制,这些机制在这个HttpClient中是不可用的 我应该注意到这对我帮助很大,所以感谢那个人。正如那边的评论所说,这家伙肯定是世界上唯一知道Windows.Web.Http的人 using System

使用
Windows.Web.Http.HttpClient
如何下载图像?我想使用这个HttpClient,因为它可以在可移植类库中使用。

这就是我最终想到的。关于
Windows.Web.Http.HttpClient
并没有太多文档,很多在线示例都使用了诸如ReadAllByteAsync之类的旧机制,这些机制在这个HttpClient中是不可用的

我应该注意到这对我帮助很大,所以感谢那个人。正如那边的评论所说,这家伙肯定是世界上唯一知道
Windows.Web.Http
的人

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using Windows.Storage.Streams;
using Windows.Web.Http;

public class ImageLoader
{
    public async static Task<BitmapImage> LoadImage(Uri uri)
    {
        BitmapImage bitmapImage = new BitmapImage();

        try
        {
            using (HttpClient client = new HttpClient())
            {
                using (var response = await client.GetAsync(uri))
                {
                    response.EnsureSuccessStatusCode();

                    using (IInputStream inputStream = await response.Content.ReadAsInputStreamAsync())
                    {
                        bitmapImage.SetSource(inputStream.AsStreamForRead());
                    }
                }
            }
            return bitmapImage;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Failed to load the image: {0}", ex.Message);
        }

        return null;
    }
}
使用系统;
使用系统诊断;
使用System.IO;
Net系统;
使用System.Threading.Tasks;
使用System.Windows.Media.Imaging;
使用Windows.Storage.Streams;
使用Windows.Web.Http;
公共类图像加载器
{
公共异步静态任务LoadImage(Uri)
{
BitmapImage BitmapImage=新的BitmapImage();
尝试
{
使用(HttpClient=new HttpClient())
{
使用(var response=await client.GetAsync(uri))
{
response.EnsureSuccessStatusCode();
使用(IInputStream inputStream=await response.Content.ReadAsInputStreamAsync())
{
bitmapImage.SetSource(inputStream.AsStreamForRead());
}
}
}
返回位图图像;
}
捕获(例外情况除外)
{
WriteLine(“未能加载映像:{0}”,例如Message);
}
返回null;
}
}

为8.1-10更新

    public async static Task<BitmapImage> LoadImage(Uri uri)
    {
        BitmapImage bitmapImage = new BitmapImage();

        try
        {
            using (Windows.Web.Http.HttpClient client = new Windows.Web.Http.HttpClient())
            {
                using (var response = await client.GetAsync(uri))
                {
                    response.EnsureSuccessStatusCode();

                    using (MemoryStream inputStream = new MemoryStream())
                    {
                        await inputStream.CopyToAsync(inputStream);
                        bitmapImage.SetSource(inputStream.AsRandomAccessStream());
                    }
                }
            }
            return bitmapImage;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Failed to load the image: {0}", ex.Message);
        }

        return null;
    }
公共异步静态任务LoadImage(Uri) { BitmapImage BitmapImage=新的BitmapImage(); 尝试 { 使用(Windows.Web.Http.HttpClient client=new Windows.Web.Http.HttpClient()) { 使用(var response=await client.GetAsync(uri)) { response.EnsureSuccessStatusCode(); 使用(MemoryStream inputStream=新的MemoryStream()) { 等待inputStream.CopyToAsync(inputStream); bitmapImage.SetSource(inputStream.AsRandomAccessStream()); } } } 返回位图图像; } 捕获(例外情况除外) { WriteLine(“未能加载映像:{0}”,例如Message); } 返回null; }
在.net核心web api中,您可以使用以下代码

[Route("getProductImage/v1")]
    [HttpGet]
    public async Task<IActionResult> getProductImage(GetProductImageQueryParam parammodel)
    {
        using (HttpClient client = new HttpClient())
        {
            MNimg_URL = MNimg_URL + parammodel.modelname;
            HttpResponseMessage response = await client.GetAsync(MNimg_URL);
            byte[] content = await response.Content.ReadAsByteArrayAsync();
            //return "data:image/png;base64," + Convert.ToBase64String(content);
            return File(content, "image/png", parammodel.modelname);
        }
    }
[路由(“getProductImage/v1”)]
[HttpGet]
公共异步任务getProductImage(GetProductImageQueryParam参数模型)
{
使用(HttpClient=new HttpClient())
{
MNimg_URL=MNimg_URL+parammodel.modelname;
HttpResponseMessage response=wait client.GetAsync(MNimg_URL);
byte[]content=wait response.content.ReadAsByteArrayAsync();
//返回“data:image/png;base64”+Convert.tobase64字符串(内容);
返回文件(内容为“image/png”,parammodel.modelname);
}
}

此处GetProductImageQueryParam是一个带有输入参数的类

请记住,现在您将无法从图像控件提供的自动图像缓存中获益。@Decademon是否可以直接指向web上的Uri?当设置为上面的Uri时,我得到了关于该Uri无效的错误(下面使用的是相同的Uri!)。该图像将只是空白,但如果我添加了图像加载失败事件并查看异常,我可以看到该错误。。。我也读过一些文章说这是不可能的,但可能只是没有解决它…是的,通常你只是直接指向一个Uri。图像没有加载真奇怪。您尝试过不同的图像URI吗?例外情况说明了什么?@Decademon我发现了我的实际问题。。。当URI被设置为图像的源时,它似乎对转义非常严格,这是HttpClient没有抱怨的,所以它的转义可能稍微聪明一点……仅供参考:还有一个SetSourceAsync方法,它可能更好地避免阻塞图像UI@JeroenVannevel不是最好的建议->@Jeroenvanevel不,
HttpClient
不应丢弃,而应重新使用:“HttpClient旨在实例化一次,并在应用程序的整个生命周期内重复使用。特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重载下可用的套接字数量。这将导致SocketException错误。“看到并@DanDiplo是的,绝对正确。我写那篇评论已经有一段时间了,现在我知道得更清楚了。我会删除它,这样就不会混淆了。对于未来的访问者:不要处理httpclientHow do you get
Windows.Web.Http
在ASP.Net Core中的依赖关系?您应该使用
Wait client.GetAsync(url)
而不是
client.GetAsync(url).Result
。除此之外,还有一个很好的例子。
[Route("getProductImage/v1")]
    [HttpGet]
    public async Task<IActionResult> getProductImage(GetProductImageQueryParam parammodel)
    {
        using (HttpClient client = new HttpClient())
        {
            MNimg_URL = MNimg_URL + parammodel.modelname;
            HttpResponseMessage response = await client.GetAsync(MNimg_URL);
            byte[] content = await response.Content.ReadAsByteArrayAsync();
            //return "data:image/png;base64," + Convert.ToBase64String(content);
            return File(content, "image/png", parammodel.modelname);
        }
    }