zoukankan      html  css  js  c++  java
  • HttpWebRequest与HttpWebResponse使用例子(转)

    转自:http://www.jb51.net/article/28401.htm

    在每个系统出写入报告错误代码(找个合理的理由,比如系统免费升级) -> 自家服务器接收并处理错误报告 -> 反馈用户(解决掉BUG就行,不要太声扬) 最近公司拓展市场异常迅猛,数周之类开出去几十套系统,虽然系统名字不一样,但各个内容相似。由于时间紧迫,很多开出去的系统 出现各种神奇的错误,当初虽然有记录错误日志,然而很多客户使用的是自己的服务器和数据库,出了问题我们并不能立即掌握信息, 因此决定做一个捕获所有系统的异常并保存到自家数据库中。 实现思路 在每个系统出写入报告错误代码(找个合理的理由,比如系统免费升级) -> 自家服务器接收并处理错误报告 -> 反馈用户(解决掉BUG就行,不要太声扬) 基础回顾 ---参考msdn 1.HttpWebRequest类:提供WebRequest类的Http特定的实现。 HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。 不要使用构造函数创建HttpWebRequest实例,请使用System.Net.WebRequest.Create(URI uriString)来创建实例,如果URI是Http://或Https://, 返回的是HttpWebRequest对象。(建立请求特定URI的对象) 当向资源发送数据时,GetRequestStream方法返回用于发送数据的Stream对象。(获取请求数据的流对象) GetResponse方法向RequestUri属性指定的资源发出同步请求并返回包含该响应的HttpWebResponse。(获取来自internet的响应) 实例讲解

    1.远程请求并返回响应

    /// <summary> 
    /// 报告系统错误 
    /// </summary> 
    /// <param name="ex"></param> 
    /// <returns></returns> 
    public static string Sys_ReportError(Exception ex) 
    { 
    try 
    { 
    //要提交表单的URI字符串 
    string uriString = "http://localhost/Sys_ReportError.aspx"; 
    HttpContext context = HttpContext.Current; 
    if (context == null) return string.Empty; 
    string targetSite = ex.TargetSite.ToString(); 
    string stackTrace = ex.StackTrace; 
    string friendlyMsg = ex.Message; 
    string errorPage = context == null || context.Request == null ? "" : context.Request.Url.ToString(); 
    string projectName = Config.Sys_Title(); 
    //要提交的字符串数据 
    string postString = "targetSite=" + HttpUtility.UrlEncode(targetSite); 
    postString += "&stackTrace=" + HttpUtility.UrlEncode(stackTrace); 
    postString += "&friendlyMsg=" + HttpUtility.UrlEncode(friendlyMsg); 
    postString += "&errorPage=" + HttpUtility.UrlEncode(errorPage); 
    postString += "&projectName=" + HttpUtility.UrlEncode(projectName); 
    postString += "&key=" + ""; 
    HttpWebRequest webRequest = null; 
    StreamWriter requestWriter = null; 
    string responseData = ""; 
    webRequest = System.Net.WebRequest.Create(uriString) as HttpWebRequest; 
    webRequest.Method = "POST"; 
    webRequest.ServicePoint.Expect100Continue = false; 
    webRequest.Timeout = 1000 * 60; 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    //POST the data. 
    requestWriter = new StreamWriter(webRequest.GetRequestStream()); 
    try 
    { 
    requestWriter.Write(postString); 
    } 
    catch (Exception ex2) 
    { 
    return "连接错误"; 
    } 
    finally 
    { 
    requestWriter.Close(); 
    requestWriter = null; 
    } 
    responseData = WebResponseGet(webRequest); 
    webRequest = null; 
    return responseData; 
    } 
    catch 
    { 
    return "未知错误"; 
    } 
    } 
    /// <summary> 
    /// Process the web response. 
    /// </summary> 
    /// <param name="webRequest">The request object.</param> 
    /// <returns>The response data.</returns> 
    public static string WebResponseGet(HttpWebRequest webRequest) 
    { 
    StreamReader responseReader = null; 
    string responseData = ""; 
    try 
    { 
    responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream()); 
    responseData = responseReader.ReadToEnd(); 
    } 
    catch 
    { 
    return "连接错误"; 
    } 
    finally 
    { 
    webRequest.GetResponse().GetResponseStream().Close(); 
    responseReader.Close(); 
    responseReader = null; 
    } 
    return responseData; 
    } 

    2.远程服务器读取流

    _context = HttpContext.Current; 
    Stream stream = _context.Request.InputStream; //获取当前传入Http输入流 
    long length = stream.Length; 
    byte[] data = _context.Request.BinaryRead((int)length);//对当前输入流进行指定字节数的二进制读取 
    string strContent = Encoding.UTF8.GetString(data);//解码为UTF8编码形式的字符串 

    代码讲解到此结束,一些相关补充:
    1.HttpWebRequest对象有一些相关设置属性,如Method(发送方式),TimeOut(请求超时时间),ContentType(Http标头的值)等等。
    2.若远程接收页面出错,该如何调试,很简单,只需写入下面的代码:

    HttpWebResponse res = null; 
    WebResponse response = null; 
    try 
    { 
    WebResponse response = webRequest.GetResponse(); 
    } 
    catch (WebException ex1) 
    { 
    res = (HttpWebResponse)ex1.Response; 
    } 
    finally 
    { 
    StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8); 
    string strhtml = sr.ReadToEnd(); 
    HttpContext.Current.Response.Write(strhtml); 
    } 

    当获取服务器响应出错时,捕捉错误,最终打印出错误即可。

    其它例子,转自:http://www.jb51.net/article/1316.htm

    最近有个朋友离开IT行业二年的朋友说要实现用程序向某个网站的页面上传数据,他是意思是每天有几十条数据要在网站页面上填写,很烦,最好用程序来写。网站页面是用POST传递的,同时没有验证码之类的东东,只有一点限制就是5分种内不能填写二次记录。这一切都好办。

    using System.Web;
    using System.Net;
    using System.Text;
    using System.IO;
    
    //创建对某个网站页面的请求
    
    HttpWebRequest  myRequest = (HttpWebRequest )WebRequest.Create("http://www.knowsky.com/a.asp")
    
    //上传的数据,”TextBox1“这些东东是网站页面里的控件ID,如果要上传多个值也是用&来分隔
    
       string postData="TextBox1="+this.textBox1.Text+"&TextBox2="+this.textBox2.Text+"
    &TextBox3="+this.textBox3.Text+"&TextBox4="+this.textBox4.Text;
       ASCIIEncoding encoding=new ASCIIEncoding();
       byte[]  byte1=encoding.GetBytes(postData);//最终编码后要上传的数据
       // Set the content type of the data being posted.
       myRequest.ContentType="application/x-www-form-urlencoded";
       myRequest.Method="post";//post上传方式
       // Set the content length of the string being posted.
       myRequest.ContentLength=postData.Length;
       Stream newStream=myRequest.GetRequestStream();
       newStream.Write(byte1,0,byte1.Length);
    
    
    详细出处参考:http://www.jb51.net/article/1316.htm

    一切就OK了,如果你想上传后看到网站的内容的话,可以在程序里放一个IE控件,使用

    axWebBrowser1.Navigate("http://www.knowsky.com/a.asp");
    axWebBrowser1.Refresh2();
    
    
    详细出处参考:http://www.jb51.net/article/1316.htm
  • 相关阅读:
    Codeforces 691A Fashion in Berland
    HDU 5741 Helter Skelter
    HDU 5735 Born Slippy
    HDU 5739 Fantasia
    HDU 5738 Eureka
    HDU 5734 Acperience
    HDU 5742 It's All In The Mind
    POJ Euro Efficiency 1252
    AtCoder Beginner Contest 067 C
    AtCoder Beginner Contest 067 D
  • 原文地址:https://www.cnblogs.com/hnfxs/p/3674901.html
Copyright © 2011-2022 走看看