c# webapi请求远程图片返回图片流

persuit666 2018-01-04 09:55:57
现在我的需求是,我知道一个图片的网络地址,比如http://t1.mmonly.cc/uploads/allimg/tuku2/16343123c-11.jpg,
但是在微信小程序的webview里边是不允许有外部连接图片的,所以我必须把这个网络图片从我自己的业务服务器(业务服务器已经添加到微信的白名单里了)上得到才能允许。

问题是现在地址栏输入webapi的地址,网页一片空白,查看图片大小是0(注:我读服务器本地磁盘图片是可以显示的)
上代码

webapi代码
 [CrossSite]
[HttpGet]
public HttpResponseMessage GetIco(string icoPath)
{
MemoryStream stream = ImgHelper.GetImgStreamFromNet(icoPath);
var resp = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(stream)
};
resp.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");
return resp;
}


GetImgStreamFromNet方法如下
  public static MemoryStream GetImgStreamFromNet(string ImgUrl)
{
Image img = GetImageFromNet(ImgUrl,
(request) =>
{//此处可以对request进行相关设定,因为此部分均为基类,所以也可以用于FtpWebRequest之类
request.Timeout = 2000;
});
return ConvertImgToStream(img);
}


GetImageFromNet方法如下
public static Image GetImageFromNet(this string url, Action<WebRequest> requestAction = null, Func<WebResponse, Image> responseFunc = null)
{
return GetImageFromNet(new Uri(url), requestAction, responseFunc);
}

ConvertImgToStream方法如下
   public static MemoryStream ConvertImgToStream(Image img)
{
BinaryFormatter binFormatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
binFormatter.Serialize(ms, img);
return ms;
}


都快崩溃了,调了一天了!百思不得骑姐!
请大神帮忙
显示的效果就如下这个熊样,空白


解决问题200分全部奉送!
...全文
3524 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨青松 2018-11-30
  • 打赏
  • 举报
回复
webapi路由解析不到 .这个字符,你可以看看吧后缀名去掉,肯定不会空白,如果想解决这个问题请联系QQ1210014671,今天刚遇到的,解决了
persuit666 2018-01-06
  • 打赏
  • 举报
回复
问题解决了 方法一:(这个写法最简单)参考1楼的写法,使用httpClient 方法二:还是用我原来的写法,注意在返回相应流的地方不要使用流 Content = new StreamContent(steam)//不要用流,不一定出啥问题,流被占用或者需要设置啥 Content = new StreamContent(new MemoryStream(bytes[])) 改用bytes实现 ,还有获取bytes的时候,果然不能用BinaryFormat,我改成了 img.Save(ms, ImageFormat.Jpeg);(原先是binFormatter.Serialize(ms, img);)就好使了,谢谢各位
  • 打赏
  • 举报
回复
获取图片的二进制字节内容,不是 BinaryFormat。自己找资料了解一下概念区别。
persuit666 2018-01-06
  • 打赏
  • 举报
回复
有段代码忘记贴了 ,加上
  /// <summary>
        /// 通过NET获取网络图片
        /// </summary>
        /// <param name="url">要访问的图片所在网址</param>
        /// <param name="requestAction">对于WebRequest需要进行的一些处理,比如代理、密码之类</param>
        /// <param name="responseFunc">如何从WebResponse中获取到图片</param>
        /// <returns></returns>
        public static Image GetImageFromNet(this Uri url, Action<WebRequest> requestAction = null, Func<WebResponse, Image> responseFunc = null)
        {
            Image img;
            try
            {
                WebRequest request = WebRequest.Create(url);
                if (requestAction != null)
                {
                    requestAction(request);
                }
                using (WebResponse response = request.GetResponse())
                {
                    if (responseFunc != null)
                    {
                        img = responseFunc(response);
                    }
                    else
                    {
                        img = Image.FromStream(response.GetResponseStream());
                    }
                }
            }
            catch
            {
                img = null;
            }
            return img;
        }
persuit666 2018-01-06
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
BinaryFormatter 的功能并不是读取图片内容,这是两回事儿。
那应该怎么做呢?
SoulRed 2018-01-05
  • 打赏
  • 举报
回复
我觉得方法是对的,应该是你的服务器相关权限没设置对。服务器的请求头类型是否可以允许文件流传输?
  • 打赏
  • 举报
回复
BinaryFormatter 的功能并不是读取图片内容,这是两回事儿。
Anonymous477 2018-01-04
  • 打赏
  • 举报
回复
大概是这个样?

[Route("transfer")]
[HttpGet]
public async Task<HttpResponseMessage> TransferAsync(string url)
{
HttpClient httpClient = new HttpClient();
return await httpClient.GetAsync(url);
}


111,048

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧