本文实例为大家分享了HttpHelper类的方法使用,供大家参考,具体内容如下
首先列出HttpHelper类
/// <summary>
/// Http操作类
/// </summary>
public class HttpHelper
{
private static log4net.ILog mLog = log4net.LogManager.GetLogger( "HttpHelper" );
[DllImport( "wininet.dll" , CharSet = CharSet.Auto, SetLastError = true )]
public static extern bool InternetSetCookie( string lpszUrlName, string lbszCookieName, string lpszCookieData);
[DllImport( "wininet.dll" , CharSet = CharSet.Auto, SetLastError = true )]
public static extern bool InternetGetCookie( string lpszUrlName, string lbszCookieName, StringBuilder lpszCookieData, ref int lpdwSize);
public static StreamReader mLastResponseStream = null ;
public static System.IO.StreamReader LastResponseStream
{
get { return mLastResponseStream; }
}
private static CookieContainer mCookie = null ;
public static CookieContainer Cookie
{
get { return mCookie; }
set { mCookie = value; }
}
private static CookieContainer mLastCookie = null ;
public static HttpWebRequest CreateWebRequest( string url, HttpRequestType httpType, string contentType, string data, Encoding requestEncoding, int timeout, bool keepAlive)
{
if (String.IsNullOrWhiteSpace(url))
{
throw new Exception( "URL为空" );
}
HttpWebRequest webRequest = null ;
Stream requestStream = null ;
byte [] datas = null ;
switch (httpType)
{
case HttpRequestType.GET:
case HttpRequestType.DELETE:
if (!String.IsNullOrWhiteSpace(data))
{
if (!url.Contains( '?' ))
{
url += "?" + data;
}
else url += "&" + data;
}
if (url.StartsWith( "https:" ))
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
}
webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = Enum.GetName( typeof (HttpRequestType), httpType);
if (contentType != null )
{
webRequest.ContentType = contentType;
}
if (mCookie == null )
{
webRequest.CookieContainer = new CookieContainer();
}
else
{
webRequest.CookieContainer = mCookie;
}
if (keepAlive)
{
webRequest.KeepAlive = keepAlive;
webRequest.ReadWriteTimeout = timeout;
webRequest.Timeout = 60000;
mLog.Info( "请求超时时间..." + timeout);
}
break ;
default :
if (url.StartsWith( "https:" ))
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
}
webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = Enum.GetName( typeof (HttpRequestType), httpType);
if (contentType != null )
{
webRequest.ContentType = contentType;
}
if (mCookie == null )
{
webRequest.CookieContainer = new CookieContainer();
}
else
{
webRequest.CookieContainer = mCookie;
}
if (keepAlive)
{
webRequest.KeepAlive = keepAlive;
webRequest.ReadWriteTimeout = timeout;
webRequest.Timeout = 60000;
mLog.Info( "请求超时时间..." + timeout);
}
if (!String.IsNullOrWhiteSpace(data))
{
datas = requestEncoding.GetBytes(data);
}
if (datas != null )
{
webRequest.ContentLength = datas.Length;
requestStream = webRequest.GetRequestStream();
requestStream.Write(datas, 0, datas.Length);
requestStream.Flush();
requestStream.Close();
}
break ;
}
//mLog.InfoFormat("请求 Url:{0},HttpRequestType:{1},contentType:{2},data:{3}", url, Enum.GetName(typeof(HttpRequestType), httpType), contentType, data);
return webRequest;
}
public static CookieContainer GetLastCookie()
{
return mLastCookie;
}
/// <summary>
/// 设置HTTP的Cookie,以后发送和请求用此Cookie
/// </summary>
/// <param name="cookie">CookieContainer</param>
public static void SetHttpCookie(CookieContainer cookie)
{
mCookie = cookie;
}
private static HttpWebRequest mLastAsyncRequest = null ;
public static HttpWebRequest LastAsyncRequest
{
get { return mLastAsyncRequest; }
set { mLastAsyncRequest = value; }
}
/// <summary>
/// 发送请求
/// </summary>
/// <param name="url">请求Url</param>
/// <param name="httpType">请求类型</param>
/// <param name="contentType">contentType:application/x-www-form-urlencoded</param>
/// <param name="data">请求数据</param>
/// <param name="encoding">请求数据传输时编码格式</param>
/// <returns>返回请求结果</returns>
public static string SendRequest( string url, HttpRequestType httpType, string contentType, string data, Encoding requestEncoding, Encoding reponseEncoding, params AsyncCallback[] callBack)
{
int timeout = 0;
bool keepAlive = false ;
if (callBack != null && callBack.Length > 0 && callBack[0] != null )
{
keepAlive = true ;
timeout = 1000*60*60;
mLog.Info( "写入读取超时时间..." + timeout);
}
// mLog.Info("开始创建请求....");
HttpWebRequest webRequest = CreateWebRequest(url, httpType, contentType, data, requestEncoding,timeout,keepAlive);
string ret = null ;
// mLog.Info("创建请求结束....");
if (callBack != null && callBack.Length > 0 && callBack[0] != null )
{
// mLog.Info("开始异步请求....");
mLastAsyncRequest = webRequest;
webRequest.BeginGetResponse(callBack[0], webRequest);
}
else
{
// mLog.Info("开始同步请求....");
StreamReader sr = new StreamReader(webRequest.GetResponse().GetResponseStream(), reponseEncoding);
ret = sr.ReadToEnd();
sr.Close();
}
mLastCookie = webRequest.CookieContainer;
//mLog.InfoFormat("结束请求 Url:{0},HttpRequestType:{1},contentType:{2},结果:{3}", url, Enum.GetName(typeof(HttpRequestType), httpType), contentType,ret);
return ret;
}
/// <summary>
/// Http上传文件
/// </summary>
public static string HttpUploadFile( string url, string path)
{
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true ;
request.AllowWriteStreamBuffering = false ;
request.SendChunked = true ;
request.Method = "POST" ;
request.Timeout = 300000;
string boundary = DateTime.Now.Ticks.ToString( "X" ); // 随机分隔线
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
byte [] itemBoundaryBytes = Encoding.UTF8.GetBytes( "\r\n--" + boundary + "\r\n" );
byte [] endBoundaryBytes = Encoding.UTF8.GetBytes( "\r\n--" + boundary + "--\r\n" );
int pos = path.LastIndexOf( "\\" );
string fileName = path.Substring(pos + 1);
//请求头部信息
StringBuilder sbHeader = new StringBuilder( string .Format( "Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n" , fileName));
byte [] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
request.ContentLength = itemBoundaryBytes.Length + postHeaderBytes.Length + fs.Length + endBoundaryBytes.Length;
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
int bytesRead = 0;
int arrayLeng = fs.Length <= 4096 ? ( int )fs.Length : 4096;
byte [] bArr = new byte [arrayLeng];
int counter = 0;
while ((bytesRead = fs.Read(bArr, 0, arrayLeng)) != 0)
{
counter++;
postStream.Write(bArr, 0, bytesRead);
}
postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
}
//发送请求并获取相应回应数据
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
//直到request.GetResponse()程序才开始向目标网页发送Post请求
using (Stream instream = response.GetResponseStream())
{
StreamReader sr = new StreamReader(instream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
return content;
}
}
}
}
public static string HttpUploadFile( string url, MemoryStream files, string fileName)
{
using (MemoryStream fs = files)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true ;
request.AllowWriteStreamBuffering = false ;
request.SendChunked = true ;
request.Method = "POST" ;
request.Timeout = 300000;
string boundary = DateTime.Now.Ticks.ToString( "X" ); // 随机分隔线
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
byte [] itemBoundaryBytes = Encoding.UTF8.GetBytes( "\r\n--" + boundary + "\r\n" );
byte [] endBoundaryBytes = Encoding.UTF8.GetBytes( "\r\n--" + boundary + "--\r\n" );
//请求头部信息
StringBuilder sbHeader = new StringBuilder( string .Format( "Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n" , fileName));
byte [] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
request.ContentLength = itemBoundaryBytes.Length + postHeaderBytes.Length + fs.Length + endBoundaryBytes.Length;
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
int bytesRead = 0;
int arrayLeng = fs.Length <= 4096 ? ( int )fs.Length : 4096;
byte [] bArr = new byte [arrayLeng];
int counter = 0;
fs.Position = 0;
while ((bytesRead = fs.Read(bArr, 0, arrayLeng)) != 0)
{
counter++;
postStream.Write(bArr, 0, bytesRead);
}
postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
}
//发送请求并获取相应回应数据
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
//直到request.GetResponse()程序才开始向目标网页发送Post请求
using (Stream instream = response.GetResponseStream())
{
StreamReader sr = new StreamReader(instream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
return content;
}
}
}
}
#region public static 方法
/// <summary>
/// 将请求的流转化为字符串
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public static string GetStr(Stream info)
{
string result = "" ;
try
{
using (StreamReader sr = new StreamReader(info, System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd();
sr.Close();
}
}
catch
{
}
return result;
}
/// <summary>
/// 参数转码
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string stringDecode( string str)
{
return HttpUtility.UrlDecode(HttpUtility.UrlDecode(str, System.Text.Encoding.GetEncoding( "UTF-8" )), System.Text.Encoding.GetEncoding( "UTF-8" ));
}
/// <summary>
/// json反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <returns></returns>
public static T Deserialize<T>( string json)
{
try
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
catch
{
return default (T);
}
}
#endregion
public static bool CheckValidationResult( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{ // 总是接受
return true ;
}
}
public enum HttpRequestType
{
POST,
GET,
DELETE,
PUT,
PATCH,
HEAD,
TRACE,
OPTIONS
}
然后列出HttpHelper的调用
1、不带参数调用
public bool ConnectServer()
{
try
{
string url = "https://i.cnblogs测试数据" ;
string xml = HttpHelper.SendRequest(url, HttpRequestType.POST, null , null , Encoding.UTF8, Encoding.UTF8);
NormalResponse nr = HuaweiXMLHelper.GetNormalResponse(xml);
if (nr.Code == "0" )
{
HttpHelper.SetHttpCookie(HttpHelper.GetLastCookie());
mIsConnect = true ;
return true ;
}
else
{
mIsConnect = false ;
return false ;
}
}
catch (System.Exception ex)
{
mIsConnect = false ;
return false ;
}
}
2.带参数调用
private bool HandleIntelligentTask( string taskId, bool bStop)
{
try
{
if (!mIsConnect)
{
return false ;
}
StringBuilder sb = new StringBuilder();
sb.AppendFormat( "<request>\r\n" );
sb.AppendFormat( "<task_id>{0}</task_id>\r\n" , taskId); //<!-- task-id为调用方生成的UUID或其它串 -->
sb.AppendFormat( "<status>{0}</status>\r\n" ,bStop?0:1);
sb.AppendFormat( "</request>\r\n" );
string xml = sb.ToString();
string url = mIAServerUrl + "/sdk_service/rest/video-analysis/handle-intelligent-analysis" ;
string xml2 = HttpHelper.SendRequest(url, HttpRequestType.POST, "text/plain;charset=utf-8" , xml, Encoding.UTF8, Encoding.UTF8);
NormalResponse nr = HuaweiXMLHelper.GetNormalResponse(xml2);
if (nr.Code == "0" )
{
return true ;
}
else
{
return false ;
}
}
catch (System.Exception ex)
{
return false ;
}
}
3.异步调用
private void ReStartAlarmServer(List< string > list, string alarmUrl, Thread[] listThread)
{
StopAlarm(alarmUrl, listThread);
listThread[0]= new Thread( new ThreadStart( delegate ()
{
try
{
if (!mIsConnect)
{
mLog.Error( "未登录!--ReStartAlarmServer-结束!" );
return ;
}
mLog.Info( "ReStartAlarmServer开始报警连接...." );
if (String.IsNullOrWhiteSpace(alarmUrl)) return ;
mLog.InfoFormat( "ReStartAlarmServer请求报警:URL={0}" , alarmUrl);
string xml = "task-id=0" ;
string xml2 = HttpHelper.SendRequest(alarmUrl, HttpRequestType.POST, "application/x-www-form-urlencoded" , xml, Encoding.UTF8, Encoding.UTF8, AlarmCallBack);
mLog.Info( "ReStartAlarmServer报警连接成功!" );
}
catch (System.Threading.ThreadAbortException ex)
{
mLog.Info( "ReStartAlarmServer线程已人为终止!" + ex.Message, ex);
}
catch (System.Exception ex)
{
mLog.Error( "ReStartAlarmServer开始报警连接失败:" + ex.Message, ex);
mLog.Info( "ReStartAlarmServer开始重新报警连接...." );
mTimes = 50;
}
finally
{
}
}));
listThread[0].IsBackground = true ;
listThread[0].Start();
}
private void AlarmCallBack(IAsyncResult ir)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)ir.AsyncState;
string salarmUrl = webRequest.Address.OriginalString;
Thread[] alarmThead = dicAlarmUrls[salarmUrl];
HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(ir);
Stream stream = response.GetResponseStream();
alarmThead[1]= new Thread( new ThreadStart( delegate ()
{
try
{
byte [] buffer = new byte [mAlarmReadCount];
int count = 0;
string strMsg = "" ;
int startIndex = -1;
int endIndex = -1;
NormalResponse res = null ;
DateTime dtStart = DateTime.Now;
DateTime dtEnd = DateTime.Now;
while (!mIsCloseAlarm)
{
count = stream.Read(buffer, 0, mAlarmReadCount);
if (count > 0)
{
strMsg += Encoding.UTF8.GetString(buffer, 0, count);
startIndex = strMsg.IndexOf( "<response>" );
endIndex = strMsg.IndexOf( "</response>" );
string xml = strMsg.Substring(startIndex, endIndex - startIndex + "</response>" .Length);
res = HuaweiXMLHelper.GetNormalResponse(xml);
strMsg = strMsg.Substring(endIndex + "</response>" .Length);
startIndex = -1;
endIndex = -1;
break ;
}
dtEnd = DateTime.Now;
if ((dtEnd - dtStart).TotalSeconds > 10)
{
throw new Exception( "连接信息未有获取到,需要重启报警!" );
}
}
while (!mIsCloseAlarm)
{
count = stream.Read(buffer, 0, mAlarmReadCount);
if (count > 0)
{
string temp = Encoding.UTF8.GetString(buffer, 0, count);
strMsg += temp;
while (strMsg.Length > 0)
{
if (startIndex == -1) //未发现第一个<task-info>
{
startIndex = strMsg.IndexOf( "<task-info>" );
if (startIndex == -1)
{
if (strMsg.Length >= "<task-info>" .Length)
{
strMsg = strMsg.Substring(strMsg.Length - "<task-info>" .Length);
}
break ;
}
}
if (startIndex >= 0)
{
int i = startIndex + "<task-info>" .Length;
int taskInfoEndIndex = strMsg.IndexOf( "</task-info>" , i);
if (taskInfoEndIndex > 0) //必须有任务结束节点
{
i = taskInfoEndIndex + "</task-info>" .Length;
int i1 = strMsg.IndexOf( "</attach-rules>" , i); //找到轨迹节点结束
int i2 = strMsg.IndexOf( "</alarm>" , i); //找到报警节点结束,发现一条报警
if (i1 == -1 && i2 == -1) //没有标志结束
{
break ;
}
else if (i1 >= 0 && (i1 < i2 || i2 == -1)) //找到轨迹结束节点
{
strMsg = strMsg.Substring(i1 + "</attach-rules>" .Length);
startIndex = -1;
endIndex = -1;
continue ;
}
else if (i2 > 0 && (i2 < i1 || i1 == -1)) //找报警节点
{
endIndex = i2; //找到报警节点结束,发现一条报警
string alarmXml = "<taskalarm>" + strMsg.Substring(startIndex, endIndex - startIndex + "</alarm>" .Length) + "</taskalarm>" ;
Thread th = new Thread( new ThreadStart( delegate ()
{
ParseAlarmXml(alarmXml);
}));
th.IsBackground = true ;
th.Start();
strMsg = strMsg.Substring(endIndex + "</alarm>" .Length);
startIndex = -1;
endIndex = -1;
continue ;
}
}
else
{
break ;
}
}
}
}
else
{
Console.WriteLine( "##########读取报警反馈:无" );
Thread.Sleep(1000);
}
}
}
catch (System.Threading.ThreadAbortException ex)
{
mLog.Info( "AlarmCallBack...7" );
try
{
if (stream != null )
{
stream.Close();
stream.Dispose();
response.Close();
}
}
catch
{
}
mLog.Info( "AlarmCallBack线程已人为终止!--0" + ex.Message, ex);
}
catch (IOException ex)
{
mLog.Info( "AlarmCallBack...8" );
try
{
if (stream != null )
{
stream.Close();
stream.Dispose();
response.Close();
}
}
catch
{
}
}
catch (ObjectDisposedException ex)
{
mLog.Info( "AlarmCallBack...9" );
mLog.Info( "AlarmCallBack读取流已人为终止!--2" + ex.Message, ex);
try
{
if (stream != null )
{
stream.Close();
stream.Dispose();
response.Close();
}
}
catch
{
}
}
catch (System.Exception ex)
{
mLog.Info( "AlarmCallBack...10" );
mLog.Error( "AlarmCallBack 0:" + ex.Message,ex);
try
{
if (stream != null )
{
stream.Close();
stream.Dispose();
response.Close();
}
}
catch
{
}
}
finally
{
}
}));
alarmThead[1].IsBackground = true ;
alarmThead[1].Start();
}
catch (System.Exception ex)
{
mLog.Info( "AlarmCallBack...11" );
mLog.Error( "AlarmCallBack 1:" + ex.Message,ex);
mLog.Info( "AlarmCallBack开始重新报警连接....3" );
mTimes = 50;
}
finally
{
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
dy("nrwz");
查看更多关于HttpHelper类的调用方法详解的详细内容...