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 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运 ...
随机推荐
- jquery适用技巧
jQuery对象与dom对象的转换 只有jquery对象才能使用jquery定义的方法.注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象. 普通的do ...
- Loading Data into HDFS
How to use a PDI job to move a file into HDFS. Prerequisites In order to follow along with this how- ...
- 使用Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换
最近在做WebMagic的后台,遇到一个问题:后台用到了数据库,本来理想情况下是用Mysql,但是为了做到开箱即用,也整合了一个嵌入式 数据库H2.这里面就有个问题了,如何用一套代码,提供对Mysql ...
- hbase shell下如何使用删除键
今天刚安装好了hbase,通过Secure CRT登录hbase shell,敲入错误命令无法使用删除键(Backspace或是Ctrl+Backspace都不管用)删除,后来在终端-->仿真下 ...
- mvc5 HTML Helper
转自:http://www.cnblogs.com/CodeFox/p/3782535.html 提及到HTML helper大家肯定不应该陌生, 因为在书写MVC View的时候肯定需要使用到它.一 ...
- ·string和date转化以及数据库时间比较
string 转换成dateString date="2014-06-26 10:09:22.819": SimpleDateFormat sdf = new SimpleDate ...
- 【转载】va_list 可变参数 简介 va_copy vprintf
[说明]本文转载自 smart 的文章 http://blog.sina.com.cn/s/blog_590be5290100qhxr.html 及百度百科 va_list是一个宏,由va_star ...
- c++拼接字符串效率比较(+=、append、stringstream、sprintf)
转自:http://www.cnblogs.com/james6176/p/3222671.html c++拼接字符串效率比较(+=.append.stringstream.sprintf) 最近写的 ...
- 如何写出性能好的sql
开发人员是很少注意SQL对数据库性能影响的重要性的,大多程序员都会认为SQL是比较简单的,需要的时候查查手册就可以了,很少有深究的. 这样的观念对大型系统的开发是致命的,需要纠正这样的观念. 造成这样 ...
- cdh4
libhadoop.so其实是后面安装impala时要用到 此处配置环境变啦时注意 下 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/l ...