C# 之 服务端获取远程资源
获取指定网页的远程资源可使用 WebClient、WebRequest、HttpWebRequest 三种方式来实现。当然也可使用webBrowse,webBrowse不做介绍。
通过 System.Net 名称空间下 WebClient 类下载文件。
//通过WebClient下载网页的源码
string url = "http://www.example.com";
System.Net.WebClient client = new System.Net.WebClient();
client.Encoding = System.Text.Encoding.UTF8;
string strHtml = client.DownloadString(url);
综合实例:
using System;
using System.Text; using System.IO;
using System.Net; namespace SnapUtility
{
public class ServerResourceHelper
{
/// <summary>
/// 通过WebClient获取远程资源
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetByWebClient(string url)
{
string strReturn = null;
WebClient client = new WebClient();
//client.Headers.Add(HttpRequestHeader.Accept, @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
//client.Headers.Add(HttpRequestHeader.Referer, null);
//client.Headers.Add(HttpRequestHeader.UserAgent, @" Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36");
//client.Headers.Add(HttpRequestHeader.ContentType, "application/octet-stream"); string strExtension = Path.GetExtension(url); //扩展名
if (String.IsNullOrEmpty(strExtension))
{
Stream stream = client.OpenRead(url);
StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
strReturn = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
}
else
{
string path = "../WebSnap/DownLoad/";
path = System.Web.HttpContext.Current.Server.MapPath(path); //自动创建文件夹
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
path += DateTime.Now.ToString("hhmmss") + strExtension; client.DownloadFile(new Uri(url), path);
}
client.Dispose();
return strReturn;
} /// <summary>
/// 通过WebRequest获取远程资源
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetByWebRequest(string url)
{
string strReturn = null;
Uri uri = new Uri(url);
WebRequest request = WebRequest.Create(uri);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream(); string strExtension = Path.GetExtension(url); //扩展名
if (String.IsNullOrEmpty(strExtension))
{
StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
strReturn = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
response.Close();
}
else
{
string fileName = DateTime.Now.ToString("hhmmss") + strExtension;
long length = response.ContentLength;
strReturn = SaveFile(ref stream, fileName, length);
}
return strReturn;
} /// <summary>
/// 通过WebRequest的Http特定实现获取远程资源
/// </summary>
/// <param name="url">远程地址</param>
/// <returns></returns>
public static string GetByHttpWebRequest(string url)
{
string strReturn = null;
Uri uri = new Uri(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream(); string strExtension = Path.GetExtension(url); //扩展名
if (String.IsNullOrEmpty(strExtension))
{
StreamReader streamReader = new StreamReader(stream, System.Text.Encoding.GetEncoding("utf-8"));
strReturn = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
response.Close();
}
else
{
string fileName = DateTime.Now.ToString("hhmmss") + strExtension;
long length = response.ContentLength;
strReturn = SaveFile(ref stream, fileName, length);
}
return strReturn;
} /// <summary>
/// FileStream保存文件
/// </summary>
/// <param name="stream"></param>
private static string SaveFile(ref Stream stream, string fileName, long length)
{
byte[] buffer = new byte[length];
stream.Read(buffer, , buffer.Length);
stream.Close(); string path = AppDomain.CurrentDomain.BaseDirectory + "DownLoad\\" + fileName;
FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
fileStream.Write(buffer, , buffer.Length);
fileStream.Flush();
fileStream.Close(); return path;
} /// <summary>
/// 保存图片
/// </summary>
/// <param name="stream"></param>
private static string SavePicture(ref Stream stream, string fileName)
{
System.Drawing.Image image = System.Drawing.Image.FromStream(stream);
stream.Close();
string path = "../WebSnap/DownLoad/";
path = System.Web.HttpContext.Current.Server.MapPath(path); //自动创建文件夹
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
path += fileName; image.Save(path, System.Drawing.Imaging.ImageFormat.Png);
image.Dispose(); //释放资源 return path;
}
}
}
注意:
“utf-8”应与指定网页的编码对应。
可以看到HttpWebRequest 方式最复杂,但确提供了更多的选择性。
有的网站检测客户端的UserAgent!如163
C# 之 服务端获取远程资源的更多相关文章
- ftpget 从Windows FTP服务端获取文件
/********************************************************************************* * ftpget 从Windows ...
- IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案
上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...
- Android从服务端获取json解析显示在客户端上面
Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...
- 服务端获取客户端html页面内容-2013-6-28-2
客户端怎么提交 整个html页面? 分析: 1>我们知道b/s模式,也知道http协议.服务端想要获取客户端的数据,客户端就 必须提交给它,服务器才能获取到. 2> ...
- springboot 服务端获取前端传过来的参数7种方式
下面为7种服务端获取前端传过来的参数的方法 1.直接把表单的参数写在Controller相应的方法的形参中,适用于GET 和 POST请求方式 这种方式不会校验请求里是否带参数,即下面的userna ...
- kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
本项目作为kbengine服务端引擎的客户端演示而写 更新kbengine插件库(https://github.com/kbengine/kbengine_unity3d_plugins): ...
- C#微信小程序服务端获取用户解密信息
using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.C ...
- 基于NIO的同步非阻塞编程完整案例,客户端发送请求,服务端获取数据并返回给客户端数据,客户端获取返回数据
这块还是挺复杂的,挺难理解,但是多练几遍,多看看研究研究其实也就那样,就是一个Selector轮询的过程,这里想要双向通信,客户端和服务端都需要一个Selector,并一直轮询, 直接贴代码: Ser ...
- c++ 网络编程(四) LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运 ...
随机推荐
- Java多线程同步——生产者消费者问题
这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型 public class ProduceConsumer{ public static void main(String[] args) ...
- 一个简单的MDI示范程序(Delphi)
http://www.cnblogs.com/pchmonster/archive/2012/01/07/2316012.html 最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI ...
- 【原】Redis分区
Redis高级篇 分区 为什么分区? Redis中的分区主要有两个目的: 允许用多台机器的内存存放更大的数据集.如果没有分区,那么你只能存放单台机器内存的最大值的数据集. 允许用多核和多台机器提高计算 ...
- Hadoop安装教程_单机/伪分布式配置
环境 本教程使用 CentOS 6.4 32位 作为系统环境,请自行安装系统(可参考使用VirtualBox安装CentOS).如果用的是 Ubuntu 系统,请查看相应的 Ubuntu安装Hadoo ...
- 给定金额m和红包数量n
这一题如果是采用暴力手段,不一定能获得正确答案,而且也非常耗时. 所以下面我们采用一个小技巧,也就是先产生n-1个红包,总得sum<m的,这样最后只要添加一个sum-m的红包钱数就可以了. 具体 ...
- Makefile学习与进阶之Makefile.am和$$(M)的意思
(1)makefile 中,出现$$(M) 是什么意思,发现还是看实际的Makefile长知识啊 在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢 ...
- 【暑假】[深入动态规划]UVAlive 3983 Robotruck
UVAlive 3983 Robotruck 题目: Robotruck Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format ...
- uva 11997 K Smallest Sums 优先队列处理多路归并问题
题意:K个数组每组K个值,每次从一组中选一个,共K^k种,问前K个小的. 思路:优先队列处理多路归并,每个状态含有K个元素.详见刘汝佳算法指南. #include<iostream> #i ...
- adb logcat调试中常用的命令介绍
Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. adb logcat 命令格式 : ad ...
- oracle 时间函数
加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) from ...