ASP.NETでWebClientを使用して画像をダウンロードできません
-
28-10-2019 - |
質問
モバイルサイトの1つで、Webページを作成しました。WebClientを使用してメインサイト(モバイルのメインサイト)から画像をダウンロードし、ビットマップを使用してサイズを変更し、モバイルサイトに画像を取得します。メインサイトは正常に動作しますが、WebClientを使用して画像をダウンロードしてサイズを変更すると、次のエラーが表示されます。
CreateThumbnail :System.Net.WebException: Unable to connect to the
remote server ---> System.Net.Sockets.SocketException: A connection
attempt failed because the connected party did not properly respond
after a period of time, or established connection failed because
connected host has failed to respond 209.59.186.108:80 at
System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,
SocketAddress socketAddress) at
System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure,
Socket s4, Socket s6, Socket& socket, IPAddress& address,
ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout,
Exception& exception)
次のコマンドを使用して、上記のIP(209.59.186.108)をpingしようとしたこの問題の解決策を提案してください。
ping m.keyboardmag.com
次の結果を返す:
Pinging m.keyboardmag.com [209.59.186.108] with 32 byte
Reply from 209.59.186.108: bytes=32 time=233ms TTL=112
Reply from 209.59.186.108: bytes=32 time=237ms TTL=112
Reply from 209.59.186.108: bytes=32 time=230ms TTL=112
Reply from 209.59.186.108: bytes=32 time=231ms TTL=112
それでもWebClientを使用して接続して画像をダウンロードすることはできません...
*************コードスニペットを更新しました****************
if (Request.QueryString["file"] != null)
{
string file = Request.QueryString["file"].ToString();
int lnHeight = Convert.ToInt32(Request.QueryString["height"]);
int lnWidth = Convert.ToInt32(Request.QueryString["width"]);
string imgUrl = Request.QueryString["file"].ToString();
Bitmap bmpOut = null;
try
{
Bitmap loBMP;
WebClient wb = new WebClient();
byte[] ret = wb.DownloadData(imgUrl);
MemoryStream ms = new MemoryStream(ret);
loBMP = new Bitmap((Stream)ms);
System.Drawing.Imaging.ImageFormat loFormat = loBMP.RawFormat;
decimal lnRatio;
int lnNewWidth = 0;
int lnNewHeight = 0;
//-----If the image is smaller than a thumbnail just return it As it is-----
if ((loBMP.Width < lnWidth && loBMP.Height < lnHeight))
{
lnNewWidth = loBMP.Width;
lnNewHeight = loBMP.Height;
}
if ((loBMP.Width > loBMP.Height))
{
lnRatio = (decimal)lnHeight / loBMP.Height;
lnNewHeight = lnHeight;
decimal lnTemp = loBMP.Width * lnRatio;
lnNewWidth = (int)lnTemp;
if (lnNewWidth > 128)
{
lnNewWidth = 128;
}
/*
lnRatio = (decimal)lnWidth / loBMP.Width;
lnNewWidth = lnWidth;
decimal lnTemp = loBMP.Height * lnRatio;
lnNewHeight = (int)lnTemp;*/
}
else
{
lnRatio = (decimal)lnHeight / loBMP.Height;
lnNewHeight = lnHeight;
decimal lnTemp = loBMP.Width * lnRatio;
lnNewWidth = (int)lnTemp;
if (lnNewWidth < 75)
{
lnNewWidth = 75;
}
}
bmpOut = new Bitmap(lnNewWidth, lnNewHeight);
Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight);
if (Path.GetExtension(imgUrl) == "jpg")
Response.ContentType = "image/jpeg";
else if (Path.GetExtension(imgUrl) == "bmp")
Response.ContentType = "image/bmp";
else if (Path.GetExtension(imgUrl) == "png")
Response.ContentType = "image/png";
else if (Path.GetExtension(imgUrl) == "gif")
Response.ContentType = "image/gif";
bmpOut.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception ex)
{
HttpContext.Current.Response.Write("CreateThumbnail :" + ex.ToString());
}
finally
{
}
解決
いくつかのサンプルコードを投稿できますか?
過去には、以下のコードを使用していましたが、Issusはありませんでした。
WebClient wb = new WebClient();
Image originalImage = Image.FromStream(wb.OpenRead(Url));
Image thumbNail = ImageResize.Crop(originalImage, Width, Height, ImageResize.AnchorPosition.Top);
画像を保存するためのコード:
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, MyQuality);
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
originalImage.Save(FilePath, jpegCodec, encoderParams);
MyCualityは0〜100のINTです。 50-70は、必要なものに応じて適切な出発点です。
他のヒント
あなたのモバイルサイトは応答するのに時間がかかりすぎています。あなたは明らかにポート80をヒットしています(スニペットから見ることができるように)ので、ブラウザでサイトをヒットできる場合、コードに何も問題がありません。何らかのネットワークレイテンシーの問題があります。
念のため、やってください:
WebClient.DownloadFile("UrlToImage");
正常に動作するはずです。
所属していません StackOverflow