none
web services 在访问一个网站的时候出错 RRS feed

  • 问题

  • 我在做一个查看天气的web服务,但是在测试的时候出现了
    Length: “stream.Length”引发了“System.NotSupportedException”类型的异常
    Position: “stream.Position”引发了“System.NotSupportedException”类型的异常


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Net;
    using System.IO;

    namespace WebApplication1
    {
        /// <summary>
        /// Weather 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
        // [System.Web.Script.Services.ScriptService]
        public class Weather : System.Web.Services.WebService
        {

            [WebMethod]
            public string GetWeather(string city)
            {
                string weacherhtml = String.Empty;
                //转换输入参数的编码类型
                string mycity = System.Web.HttpUtility.UrlEncode(city, System.Text.UnicodeEncoding.GetEncoding("gb2312"));
                //初始化新的 WebRequest
                HttpWebRequest webrt = (HttpWebRequest)WebRequest.Create("http://php.weather.sina.com.cn/search.php?city=" + mycity );
                //返回对 Internet 请求的响应。
                HttpWebResponse webrs = (HttpWebResponse)webrt.GetResponse();

                //从 Internet 资源返回数据流。
                Stream stream = webrs.GetResponseStream();

                //读取数据流
                StreamReader srm = new StreamReader(stream, System.Text.Encoding.Default);
                //从头读到尾,把数据读到weacherhtml中
                weacherhtml = srm.ReadToEnd();
                //关闭打开的资源
                srm.Close();
                stream.Close();
                webrs.Close();
                //针对不同的网站,以下开始部分和结束部分不同。
                //可通过查看网站的源文件解决。
                int start = weacherhtml.IndexOf("城市天气 begin");
                int end = weacherhtml.IndexOf("城市天气 end");
                //返回一个HTML的Table,预报城市天气
                return weacherhtml.Substring(start + 14, end - start);
            }
        }
    }

    请各位高手给指点一下

    2009年12月24日 9:16

答案

  • 恩  在调试的时候  这个流应该已经断开了 不像你从file中的流是持续保存的
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    • 已标记为答案 LTL007 2009年12月29日 3:12
    2009年12月27日 1:18
    版主

全部回复

  • 如果我没有记错的话,这里的请求返回的Stream是不可读的
    你可以先测试下其stream.CanRead属性是否为true  应该是false 的
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年12月24日 11:17
    版主
  • 我测试了,但是stream.CanRead 属性为True,Canseek为False
    2009年12月24日 11:34
  • 你好  昨晚我弄错了 这个流是可读的 ,但是不可以写

    我试了你的代码是可以的,但是你那里读取某个城市的天气的方法不对
    private static void TestHttpWebRequest()
            {
                string weacherhtml = String.Empty;
                //转换输入参数的编码类型
                string mycity = System.Web.HttpUtility.UrlEncode("成都", System.Text.UnicodeEncoding.GetEncoding("gb2312"));
                //初始化新的 WebRequest
                HttpWebRequest webrt = (HttpWebRequest)WebRequest.Create("http://php.weather.sina.com.cn/search.php?city=" + mycity);
                //返回对 Internet 请求的响应。
                HttpWebResponse webrs = (HttpWebResponse)webrt.GetResponse();

                //从 Internet 资源返回数据流。
                Stream stream = webrs.GetResponseStream();

                //读取数据流
                StreamReader sw = new StreamReader(stream, System.Text.Encoding.Default);

                //从头读到尾,把数据读到weacherhtml中
                weacherhtml = sw.ReadToEnd();
                //关闭打开的资源
                sw.Close();
                stream.Close();
                webrs.Close();
                //针对不同的网站,以下开始部分和结束部分不同。
                //可通过查看网站的源文件解决。
                int start = weacherhtml.IndexOf("城市天气 begin");
                int end = weacherhtml.IndexOf("城市天气 end");
                //返回一个HTML的Table,预报城市天气
                Console.WriteLine(weacherhtml.Substring(start + 14, end - start));


            }


    返回的结果中这段是相关的 要想提取出来是比较麻烦的
     <div class="nav2">
      <div class="nav21">
       <h1>成都<span>(Chengdu)</span></h1>
      </div>
      <div class="nav22">
             <span class="i1"><script type="text/javascript">document.write(get_w_update_time());</script></span>
                 |  <a href="http://sms.sina.com.cn/magazine/moblie/dy.html?from=403#record" target="_blank" class="i4">天气短信预订</a> <a href="http://news.sina.com.cn/wap/tianqi.html" target="_blank" class="i5">手机看天气</a> <a href="javascript:sent_to_vb('成都','2009年12月25日,成都,多云转阴,12℃~4℃,风力:≤3级');" class="i6">转发至微博</a>
      </div>
     </div>
     <!-- nav end -->
     <!--  par begin-->
      <div class="part-a">
       <div class="part-a-l">
        <div class="blk-s1">    
         <div class="title-s1">
                        <h2><img src="http://www.sinaimg.cn/dy/weather/images/php/w513_m_01.gif" width="56" height="35" alt="今天" /><span>2009年12月25日 星期五 己丑(牛)年 十一月初十</span></h2>
          <span class="more"><span id="wtqs_c" title="摄氏度">℃</span> | <span id="wtqs_f" title="华氏度">℉</span></span><span class="more" style="margin-right:20px;"><a href="#h">历史气候</a></span>     </div>
         <!-- box begin-->
         <div class="box-s1">
          <div class="box-s1-l">
           <div class="w-icon"><img src="http://image2.sina.com.cn/dy/weather/images/figure/duoyun_big.gif" ><img src="http://image2.sina.com.cn/dy/weather/images/figure/yin_big.gif" ></div>
           <h2>多云转阴</h2>
           <div class="w-number">
            <span class="tpte">12℃</span>~<span class="tpte">4℃</span>
           </div>
          </div>
          <div class="info-area">
           <p></p>
           <ul class="list-s1">
            <li>风向:南</li>                             <li>体感温度:<span class="tpte">13℃</span>~<span class="tpte">6℃</span></li>                <li>风力:≤3级</li>       </ul>
           <div class="line-s1"></div>
           <ul class="list-s2">
            <li>紫外线:<span class="fgreen">最弱</span></li>                             <li>舒适度:<span class="fgreen">较舒适</span></li>                             <li>污染指数:<span class="fgreen">中</span></li>                           
            <li>防晒指数:<span class="fgreen">弱</span></li>        <li>中暑指数:<span class="fgreen">无</span></li>        <li>穿衣指数:<span class="fgreen">温凉</span></li>        <li>空调指数:<span class="fred">开启制暖空调</span></li>        <li>洗车指数:<span class="fgreen">适宜</span></li>        <li>钓鱼指数:<span class="fgreen">较适宜</span></li>                            
                                        </ul>
          </div>
         </div>
         <!-- box end-->
        </div>

        <div class="blk-s2">     
         <div class="b_line"></div>    
         <div class="blk-s3">
          <!-- box begin-->
          <div class="box-s2">
                            <h3><img src="http://www.sinaimg.cn/dy/weather/images/php/w513_m_03.gif" width="38" height="20" alt="明天" /> <span class="date">12月26日 星期六</span></h3>
           <div class="w-icon"><img src="http://image2.sina.com.cn/dy/weather/images/figure/duoyun_big.gif" ></div>
           <div class="info-area">
            <p>天气:多云</p>
            <p>温度:<span class="tpte">11℃</span>~<span class="tpte">3℃</span></p>
            <p>风力:≤3级</p>
           </div>
          </div>
          <!-- box end-->
                                  <!-- box begin-->
          <div class="box-s2">
                             <h3><img src="http://www.sinaimg.cn/dy/weather/images/php/w513_m_04.gif" width="41" height="20" alt="后天" /> <span class="date">12月27日 星期日</span></h3>
           <div class="w-icon"><img src="http://image2.sina.com.cn/dy/weather/images/figure/duoyun_big.gif" ></div>
           <div class="info-area">
            <p>天气:多云</p>
            <p>温度:<span class="tpte">11℃</span>~<span class="tpte">3℃</span></p>
            <p>风力:≤3级</p>
           </div>
          </div>
          <!-- box end-->
                                 </div>


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年12月25日 1:47
    版主
  • 您的意思是我写的那个方法里面有返回的数据流,不好提取出来。
    可是我在测试的时候当分步调试到
    //从 Internet 资源返回数据流。
                Stream stream = webrs.GetResponseStream();
               
    执行后,在即时窗口查看一下它的值得时候
    就报出
    stream
    {System.Net.ConnectStream}
        [System.Net.ConnectStream]: {System.Net.ConnectStream}
        base {System.MarshalByRefObject}: {System.Net.ConnectStream}
        CanRead: true
        CanSeek: false
        CanTimeout: true
        CanWrite: false
        Length: “stream.Length”引发了“System.NotSupportedException”类型的异常
        Position: “stream.Position”引发了“System.NotSupportedException”类型的异常
        ReadTimeout: 300000
        WriteTimeout: 300000

    我看不到返回的数据

    2009年12月25日 2:18
  • 恩  在调试的时候  这个流应该已经断开了 不像你从file中的流是持续保存的
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    • 已标记为答案 LTL007 2009年12月29日 3:12
    2009年12月27日 1:18
    版主