.net
我相信这个世界上有神,其实神也是人,只不过他做到了人做不到的事情,所以他变成了神
posts - 7,comments - 8,trackbacks - 0
     摘要: linq to sql的多条件动态查询确实是一件头痛的事情,用表达式树或反射方法要写一大堆代码,有时候想想与其这么复杂,还不如回到手动sql拼接的年代,但是技术总是向前发展的,终归还是要在linq上解决这一问题,无意在网上发现一个还算比较简单的办法,分享一下:voidShowData(){using(DBDataContextdb=newDBDataContext(Database.Connect... 阅读全文
posted @ 2008-04-27 00:16 星光熠熠 阅读(141) | 评论 (2)编辑
1、新的异常处理结构

2、可以捕获和处理过去会导致批处理终止的错误
前提是这些错误不会导致连接中断(通常是严重程度为21以上的错误,例如,表或数据库完整性可疑、硬件错误等等。)。

3、TRY/CATCH 构造
SET XACT_ABORT ON
   BEGIN TRY
     <core logic>
   END TRY
   BEGIN CATCH TRAN_ABORT
     <exception handling logic>
   END TRY

@@error may be quired as first statement in CATCH block

4、演示代码
USE demo
  GO
  --创建工作表

  CREATE TABLE student
  ( 
      stuid INT NOT NULL PRIMARY KEY,
      stuname VARCHAR(50)
  )

  CREATE TABLE score
  (
      stuid INT NOT NULL REFERENCES student(stuid),
      score INT
  )
GO

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')
INSERT INTO student VALUES (103,'lishi')
INSERT INTO student VALUES (104,'maliu')

--调用一个运行时错误
SET XACT_ABORT OFF
  BEGIN TRAN
     INSERT INTO score VALUES (101,90)
     INSERT INTO score VALUES (102,78)
     INSERT INTO score VALUES (107, 76) /* 外键错误 */
     INSERT INTO score VALUES (103,81)
     INSERT INTO score VALUES (104,65)
  COMMIT TRAN
  GO

  SELECT * FROM student
  SELECT * FROM score

--使用TRY...CATCH构造,并调用一个运行时错误
SET XACT_ABORT OFF
  BEGIN TRY
    BEGIN TRAN
       INSERT INTO score VALUES (101,90)
       INSERT INTO score VALUES (102,78)
       INSERT INTO score VALUES (107, 76) /* 外键错误 */
       INSERT INTO score VALUES (103,81)
       INSERT INTO score VALUES (104,65)
    COMMIT TRAN
    PRINT '事务提交'
  END TRY
  BEGIN CATCH
    ROLLBACK
     PRINT '事务回滚'
        SELECT ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_MESSAGE() as ErrorMessage;
   END CATCH
GO

SELECT * FROM score
GO

快照隔离 Snapshot Isolation

1、写入程序不会阻碍读取程序
2、Snapshot isolation must be enabled for DB
      ALTER DATABASE 数据库 SET allow_snapshot_isolation ON
3、Snapshot isolation must be enabled for connection
      Set transaction isolation level snapshot
4、UPDATE transactions keep old versions of data in a linked list
5、新的隔离级别提供了以下优点:
  1) 提高了只读应用程序的数据可用性
  2) 允许在OLTP环境中执行非阻止读取操作
  3) 可对写入事务进行自动的强制冲突检测
6、演示代码
CREATE DATABASE demo2
GO
USE demo2
   ALTER DATABASE demo2 SET allow_snapshot_isolation ON
   CREATE TABLE test
   (
     tid INT NOT NULL primary key,
     tname VARCHAR(50) NOT NULL
   )
  INSERT INTO test VALUES(1,'version1')
  INSERT INTO test VALUES(2,'version2')

--连接一

USE demo2
BEGIN TRAN
   UPDATE test SET tname='version3' WHERE tid=2
   SELECT * FROM test

--连接二
USE demo2
   SET transaction isolation level snapshot
   SELECT * FROM test 

TOP 增强功能

1、TOP 增强
可以指定一个数字表达式,以返回要通过查询影响的行数或百分比,还可以根据情况使用变量或子查询。
可以在DELETE、UPDATE和INSERT查询中使用TOP选项。

2、更好地替换SET ROWCOUNT选项,使之更为有效。

OUTPUT

1、SQL Server 2005引入一个新的OUTPUT子句,以使您可以冲修改语句(INSERT、UPDATE、DELETE)中将数据返回到表变量中。

2、新的OUTPUT子局的语法为:
OUTPUT <dml_select_list> INTO @table_variable
可以通过引用插入的表或删除的表来访问被修改的行的旧/新影象,其方式与访问触发器类似。在INSERT语句中,只能访问插入的表。在DELETE语句中,只能访问删除的表。在UPDATE语句中,可以访问插入的表和删除的表。

3、代码演示
USE demo
GO
CREATE TABLE tt
(
  id INT IDENTITY,
  c1 VARCHAR(15)
)
GO

INSERT INTO tt VALUES ('r1')
INSERT INTO tt VALUES ('r2')
INSERT INTO tt VALUES ('r5')
INSERT INTO tt VALUES ('r6')
INSERT INTO tt VALUES ('r7')
INSERT INTO tt VALUES ('r8')
INSERT INTO tt VALUES ('r9')
INSERT INTO tt VALUES ('r10')

DECLARE @del AS TABLE (deletedId INT, deletedValue VARCHAR(15))
DELETE tt
OUTPUT DELETED.id, DELETED.c1 INTO @del
WHERE id < 3
SELECT * FROM @del
GO
-----------------------------------------------
USE demo
GO
CREATE TABLE toptest (column1 VARCHAR(150))
GO
INSERT INTO toptest VALUES('t1')
INSERT INTO toptest VALUES('t2')
INSERT INTO toptest VALUES('t3')
INSERT INTO toptest VALUES('t4')
INSERT INTO toptest VALUES('t5')
INSERT INTO toptest VALUES('t6')
INSERT INTO toptest VALUES('t7')
INSERT INTO toptest VALUES('t8')
SELECT * FROM toptest
GO

CREATE TABLE toptest2 (column2 VARCHAR(150))
GO
INSERT INTO toptest2 VALUES('c1')
INSERT INTO toptest2 VALUES('c2')

--声明3个变量
DECLARE @a INT
DECLARE @b INT
DECLARE @c INT

--赋值
SET @a = 10
SET @b = 5
SELECT @c = @a/@b

--使用计算表达式
SELECT TOP(@c) * FROM toptest

--使用SELECT语句作为条件
SELECT TOP(SELECT COUNT(*) FROM toptest2) *
FROM toptest

--指出top
DELETE TOP(2) toptest where column1>'t6'

--更新top
UPDATE TOP(2) toptest SET column1 = 'hi' where column1<='t2'

SELECT * FROM toptest

排序函数 Ranking Functions

1、SQL Server引入几个新的排序函数:如ROW_NUMBER、RANK、DENSE_RANK等。这些新函数使您可以有效地分析数据以及向查询的结果行提供排序值。

2、排序函数都遵循类似的语法模式:
()OVER
([PARTITION BY]
ORDER BY)
该函数只能在查询的两个子句中指定 - 在SELECT子句或ORDER BY子句中。以下详细讨论不同的函数。 

3、ROW_NUMBER
ROW_NUMBER是结果集的顺序, 而不是数据库中纪录存放的原始顺序
USE demo
GO
CREATE TABLE rankorder
(
 orderid INT,
 qty INT
)
GO
INSERT rankorder VALUES(30001,10)
INSERT rankorder VALUES(10001,10)
INSERT rankorder VALUES(10006,10)
INSERT rankorder VALUES(40005,10)
INSERT rankorder VALUES(30003,15)
INSERT rankorder VALUES(30004,20)
INSERT rankorder VALUES(20002,20)
INSERT rankorder VALUES(20001,20)
INSERT rankorder VALUES(10005,30)
INSERT rankorder VALUES(30007,30)
INSERT rankorder VALUES(40001,40)
GO
SELECT orderid,qty,
  ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
  RANK()       OVER(ORDER BY qty) AS rank,
  DENSE_RANK() OVER(ORDER BY qty) AS denserank
FROM rankorder
ORDER BY qty

通用表表达式 Common Table Expressions 

通用表表达式(CTE)是一个可以由定义语句引用的临时表命名的结果集。在他们的简单形式中,您可以将CTE视为类似于视图和派生表混合功能的改进版本。在查询的FROM子句中引用CTE的方式类似于引用派生表和视图的方式。只须定义CTE一次,即可在查询中多次引用它。在CTE的定义中,可以引用在同一批处理中定义的变量。但是CTE的真正威力在于它们的递归功能,即CTE可以包含对它们自身的引用。

视图、派生表和CTE内部的查询的一般形式

1、视图
CREATE VIEW <view_name>(<column_aliases>) AS <view_query>

2、派生表
SELECT * FROM (<derived_table)query>) AS <dericed_table_alias>(<column_aliases>)

3、CTE
WITH <cte_alias>(<column_aliases>)
AS
{
 <cte_query>
)
SELECT * FROM <cte_alias]>
在关键字WITH之后,为CTE提供一个别名,并且为它的结果列提供一个可选的别名列表;编写CTE的主体;然后从外部查询中引用它。

4、演示代码
USE AdventureWorks
GO
WITH SalesCTE(ProductID, SalesOrderID)
AS
(
 SELECT ProductID, COUNT(SalesOrderID)
 FROM Sales.SalesOrderDetail
 GROUP BY ProductID
)
SELECT * FROM SalesCTE

Recursive CTEs 递归的通用表表达式

递归的CTE是根据至少两个查询(或者称为两个成员)构建的,一个是非递归查询,也成为固定成员,只能调用一次,另外一个是递归查询,也成为递归成员(RM),可以反复调用,直到查询不再返回行。查询由UNION ALL运算符连接为一个单独的CTE。

--使用递归的通用表表达式
USE demo
GO
CREATE TABLE CarParts
(
 CarID INT NOT NULL,
 Part VARCHAR(15),
 SubPart VARCHAR(15),
 Qty INT
)
GO
INSERT CarParts VALUES (1, 'Body', 'Door', 4)
INSERT CarParts VALUES (1, 'Body', 'Trunk Lid', 1)
INSERT CarParts VALUES (1, 'Body', 'Car Hood', 1)
INSERT CarParts VALUES (1, 'Door', 'Handle', 1)
INSERT CarParts VALUES (1, 'Door', 'Lock', 1)
INSERT CarParts VALUES (1, 'Door', 'Window', 1)
INSERT CarParts VALUES (1, 'Body', 'Rivets', 1000)
INSERT CarParts VALUES (1, 'Door', 'Rivets', 100)
INSERT CarParts VALUES (1, 'Door', 'Mirror', 1)
GO
SELECT * FROM CarParts
GO

WITH CarPartsCTE(SubPart, Qty)
AS
(
 -- 固定成员 (AM):
 -- SELECT查询无需参考CarPartsCTE
 SELECT SubPart, Qty
 FROM CarParts
 WHERE Part = 'Body'
 UNION ALL
 -- 递归成员 (RM):
 -- SELECT查询参考CarPartsCTE
 SELECT CarParts.SubPart, CarPartsCTE.Qty * CarParts.Qty
 FROM CarPartsCTE
 INNER JOIN CarParts ON CarPartsCTE.SubPart = CarParts.Part
 WHERE CarParts.CarID = 1
)
-- 外部查询
SELECT SubPart, SUM(Qty) AS TotalNUM
FROM CarPartsCTE
GROUP BY SubPart  

新的关系运算符 PIVOT/UNPIVOT/APPLY

1、PIVOT
PIVOT运算符将行旋转为列,并且可能同时执行聚合。使用PIVOT运算符时要注意的重要一点是,需要为它提供一个查询表达式,表达式使用视图、派生表或者是CTE只返回所关注的列。

2、UNPIVOT
UNPIVOT运算符执行与PIVOT运算符相反的操作;他将列旋转为行了。

3、APPLY
APPLY关系运算符允许您对外部表的每个行调用指定的表值函数一次。您可以在查询的FROM子句中指定APPLY,其方式与使用JOIN关系运算符类似。APPLY具有两种形式:CROSS APPLY和OUTER APPLY。

演示:

USE demo
GO

CREATE TABLE orders
(
 Customer VARCHAR(10) NOT NULL,
 product VARCHAR(20) NOT NULL,
 quantity INT NOT NULL
)
GO
INSERT orders VALUES('Mike', 'Bike',3)
INSERT orders VALUES('Mike','Chain',2)
INSERT orders VALUES('Mike','Bike',5)
INSERT orders VALUES('Lisa','Bike',3)
INSERT orders VALUES('Lisa','Chain',3)
INSERT orders VALUES('Lisa','Chain',4)
INSERT orders VALUES('Lisa','Bike',2)

SELECT * FROM orders

SELECT * FROM orders
PIVOT (SUM(quantity) FOR product IN ([Bike],[Chain])) AS a
USE demo
GO
CREATE TABLE SALES1
(
  [Year] INT,
  Quarter CHAR(2),
  Amount FLOAT
)
GO
INSERT INTO SALES1 VALUES (2001, 'Q1', 80)
INSERT INTO SALES1 VALUES (2001, 'Q2', 70)
INSERT INTO SALES1 VALUES (2001, 'Q3', 55)
INSERT INTO SALES1 VALUES (2001, 'Q3', 110)
INSERT INTO SALES1 VALUES (2001, 'Q4', 90)
INSERT INTO SALES1 VALUES (2002, 'Q1', 200)
INSERT INTO SALES1 VALUES (2002, 'Q2', 150)
INSERT INTO SALES1 VALUES (2002, 'Q2', 40)
INSERT INTO SALES1 VALUES (2002, 'Q2', 60)
INSERT INTO SALES1 VALUES (2002, 'Q3', 120)
INSERT INTO SALES1 VALUES (2002, 'Q3', 110)
INSERT INTO SALES1 VALUES (2002, 'Q4', 180)
GO

SELECT * FROM SALES1
PIVOT
(SUM (Amount) --使用SUM聚合数量列
FOR [Quarter] --PIVOT Quarter 列
IN (Q1, Q2, Q3, Q4)) --使用季节
AS P
GO

SELECT * INTO temp1 FROM orders
PIVOT (sum(quantity) FOR product IN ([Bike],[Chain])) AS a

SELECT * FROM temp1

SELECT customer, product,quantity
FROM temp1
UNPIVOT(quantity FOR product IN ([Bike],[Chain])) AS a
----------------------------------------------------
USE demo
GO
CREATE TABLE Arrays
(
  aid INT NOT NULL IDENTITY PRIMARY KEY,
  array VARCHAR(7999) NOT NULL
)
GO
INSERT INTO Arrays VALUES('')
INSERT INTO Arrays VALUES('10')
INSERT INTO Arrays VALUES('20,40,30')
INSERT INTO Arrays VALUES('-1,-3,-5')
GO
CREATE FUNCTION  function1(@arr AS VARCHAR(7999))
  RETURNS @t TABLE(pos INT NOT NULL, value INT NOT NULL)
AS
BEGIN
  DECLARE @end AS INT, @start AS INT, @pos AS INT
  SELECT @arr = @arr + ',', @pos = 1,
    @start = 1, @end = CHARINDEX(',', @arr, @start)
  WHILE @end > 1
  BEGIN
    INSERT INTO @t VALUES(@pos, SUBSTRING(@arr, @start, @end - @start))

    SELECT @pos = @pos + 1,
      @start = @end + 1, @end = CHARINDEX(',', @arr, @start)
  END
  RETURN
END

--测试
SELECT * FROM function1('200,400,300')
GO

SELECT A.aid, F.*
FROM Arrays AS A
  CROSS APPLY function1(array) AS F
GO
SELECT A.aid, F.*
FROM Arrays AS A
  OUTER APPLY function1(array) AS F
GO

DDL触发器 DDL Triggers

SQL Server 2005可以就整个服务器或数据库的某个范围为DDL事件定义触发器。也可以为单个DDL语句(例如:CREAT_TABLE、DROP_TABLE等)或者为一组语句(例如:指定DDL_DATABASE_LEVEL_EVENTS想要触发器触发数据库所有DDL事件)定义DDL触发器。

在DDL触发器内部,可以通过访问eventdata()函数获得与激发该触发器的事件有关的数据。该eventdata()函数返回有关事件的xml数据。

DDL触发器特别有用的方案包括DDL更改的完整性检查、审核方案以及其他方案。

代码演示:

USE demo
GO
CREATE TRIGGER prevent_drop_table ON DATABASE FOR DROP_TABLE
AS
RAISERROR('没有删除表的权限.', 10, 1)
PRINT '尝试在数据库' + DB_NAME() + '中删除表.'
PRINT CONVERT (nvarchar (1000),EventData())
ROLLBACK
GO
-- 测试
CREATE TABLE TestDROP(col1 INT)
GO
INSERT INTO TestDROP VALUES(1)

DROP TABLE testdrop

-- Server
CREATE TRIGGER audit_ddl_logins ON ALL SERVER
  FOR CREATE_LOGIN, ALTER_LOGIN, DROP_LOGIN
AS
PRINT '发生DDL LOGIN.'
PRINT CONVERT (nvarchar (1000),EventData())
GO

-- 测试
CREATE LOGIN login1 WITH PASSWORD = '123'
ALTER LOGIN login1 WITH PASSWORD = 'xyz'
DROP LOGIN login1

总结

SQL Server 2005中的Transaction-SQL增强功能提高了用户在编写查询时的表达能力,使用户可以改善代码的性能,并且扩充了错误处理能力。

SQL Server 2005 在Transaction-SQL上所做的改进反映了其更好地满足了ANSI-99 SQL规范的要求以及客户的需求。

在Transaction-SQL和托管代码之间的选择。

posted @ 2008-04-08 17:47 星光熠熠 阅读(58) | 评论 (1)编辑

ASP.NET 2.0 增加了一个新特性: Event Validation. 这个特性会对 PostBack 的值进行验证,确保是合法的值。其实现原理是在页面 Render 的时候,ASP.NET 引擎会对控件的可能的值以及控件的 UniqueID 进行 hash 计算,得到一个值。页面里所有需要回发的控件的这些计算值就组成了一个列表,组合后放在隐藏字段 __EVENTVALIDATION 中。在页面回发后,会对这个字段的内容进行解包,然后重新计算对比 hash 值是否一致。这个做法的好处是能够防止一些模拟的 post 攻击,但也有一个不方便的地方,就是有时候如果需要用 javascript 修改页面里的一些内容,则回发后不会被当作合法的数据,而抛出一个异常。
另外,如果页面非常大或者网速缓慢,用户在还没有下载到 __EVENTVALIDATION 这个字段的时候就点下 submit,导致回发数据不完整,也会导致异常的发生。

解决这个问题的办法是在 Page 的 Directive 里面禁用 EventValidation,目前还没有针对单独控件进行禁用的办法。
posted @ 2007-12-06 20:00 星光熠熠 阅读(115) | 评论 (1)编辑
  • Ajallerix : AJAX, simple, fast Web image gallery demo ; at Novell
  • AJAX - microlink pattern tutorial : A microlink is a link that opens up content below it.
  • Ajax BBC News RSS Reader : demo by Nigel Crawley
  • AJAX Chat in Python with Dojo : at AquaAjax
  • Ajax Chess : multiplayer chess
  • Ajax examples at BackBase : examples demonstrating several aspects of the Backbase technology.
  • Ajax examples at Rico : Inner HTML, JavaScript updater etc.
  • Ajax examples using ColdFusionMX, SQLServer, SOAP : Contact Manager, NOAA 7 Day Forecast code and demos.
  • Ajax Feed TV : News feed
  • Ajax inline dictionary : Highlight any text on this site then right click. A tooltip containing the definition of the selected word should show up.
  • Ajaxload : Ajax loading gif generator.
  • Ajax Login Demo : Creating a secure login system using XMLHttpRequest
  • Ajax Newsletter Signup : A newsletter signup form that shows Thank You on the same page.
  • ajaxProject : Project Management applicaiton with rich UI
  • Ajax Rater : A star rating system that uses Ajax.
  • AJAX-S : An Ajax-based slideshow system.
  • AJAX Spell Checker : spell check text / form content.
  • Ajax Toolbox : Tools for the Ajax Developer
  • Amazon Catalog Tree : Amazon Catalog Tree
  • Amazon Zuggest : Amazon product suggestion (like google suggest)
  • Askeet by symfony : Digg-like AJAX interactions; open source
  • Backbase - Ajax Demos : Ajax demos at BackBase
  • Basic Ajax Examples : Ping, track changes, drop down, Google suggest hack etc at Clearnova
  • Behaviour : Fading lists, Sortable lists, Dropout boxen, Shaky lists
  • chat.app : ajax chat
  • Chihuahua Word Puzzle : daily word puzzles
  • Coloir : Ajax Slideshow
  • DHTML arcade/action games : a collection that demonstrate the power of DHTML
  • DomAPI : Windows Desktop, Outlook-like, RSS Reader
  • Drag and Drop Shopping Cart Demo : at CyberDummy
  • Easy AJAX inline text edit 2.0 : edit a piece of text inline
  • FileChucker : File upload and progress bar at Encodable.com
  • Gmail Style Check Username AJAX Demo : at CyberDummy
  • Google Web Toolkit Example Projects : Hello World, Dynamic Table, Desktop App Clone etc
  • GreyBox : Pop up window using idea of light box.
  • FiftyFourEleven: Ajax Examples
  • IntuiCat - ajax Catalogue : Ajax-based Catalogue Demo
  • jsLINB programming demos : LINB(Lazy INternet and Browser)
  • JSlog : Ajax logging tool.
  • JS/UIX Unix Shell : JS/UIX is an UN*X-like OS for standard web-browsers, written entirely in JavaScript.
  • Lace : free web chat application
  • Lightbox : simple, unobtrusive script used to overlay images on the current page.
  • Leightbox : Light Box with inline div’s instead of AJAX calls.
  • Live Quote Demo : Simple way of creating an updating stock quote table in ajax.
  • Magnetic Poetry : drag and drop poetry
  • Metatron Chat Engine : PHP/MySQL/JavaScript powered chat engine
  • Monket Calendar : online calendar
  • Multi List Drag Drop Demo : at CyberDummy
  • NetDirector : open and extensible framework for managing configurations of common open source network services.
  • nexImage : Image processing demo
  • Opera Platform : Enabling AJAX applications on mobile phones
  • Orbeon examples : various examples illustrating the capabilities of OPS, from the OPS Tutorial examples to XForms examples
  • OVO Suite : Online Virtual Office : virtual office limited demo
  • phpFreeChat : php Free Chat
  • S5: A Simple Standards-Based Slide Show System : S5 is a slide show format based entirely on XHTML, CSS, and JavaScript.
  • script.aculo.us Reflector : image reflector script that uses uses opacity-based fades
  • Slider Bar Demo : at CyberDummy
  • SmallestAjax : Smallest Ajax example in the world?
  • Spell Check demo : by Primal Grasp
  • Super Maryo World : Japanese game demo
  • Tacos : Tacos provides a library of useful Tapestry components. This application provides some examples to get you started.
  • theList : to-do list / bug-tracker
  • ThickBox : ThickBox is a Lightbox than can show html pages as well as images.
  • Tooltip.js : Tooltip.js is a simple class to make it possible to add tooltips to your page.
  • Treehouse Chat : ajax chat
  • Tudu Lists : open-source to-do lists
  • WeBoggle : Ajax Boggle
  • XHTML live Chat : ajax chat
  • YahooSearchAsYouType : Yahoo search as you type
  • ZK Demo : demo programs for various components
  • posted @ 2007-11-28 16:22 星光熠熠 阅读(70) | 评论 (0)编辑
    用这东西可以做出
    自动登陆论坛发贴回帖了
    自动投票了
    自动登陆,然后偷取资料
    等等了,大家自己发挥吧…………

    极力推荐大家好好研究一下,大大地有帮助。(个人感觉,对我帮助很大)

    /*
    *
    * http协议操作模块:简化了 Get和Post请求。
    *
    * */

    using System;
    using System.Net ;

    namespace stealweb
    {
            /// <summary>
            /// HttpProc 的摘要说明。
            /// </summary>
            public class HttpProc
            {
    /// <summary>
    /// 创建请求
    /// </summary>
    /// <returns>请求对象</returns>
                    private HttpWebRequest CreateRequest()
                    {
                            HttpWebRequest 请求=null;
                     
                            请求=(HttpWebRequest)HttpWebRequest.Create(this._strUrl);//创建请求
                            请求.Accept = "*/*"; //接受任意文件
                            请求.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)"; // 模拟使用IE在浏览
                            //请求.AllowAutoRedirect = false;//这里不允许302
                            请求.CookieContainer = new CookieContainer();//cookie容器,
                            请求.Referer=this.strRefUrl ; //当前页面的引用


                            //使用代理
                            WebProxy myProxy=new WebProxy( );
                            if (config.Proxy_DEF!="0")
    //                        {
    //                                //使用浏览器的代理
    //                                myProxy=(WebProxy)请求.Proxy;
    //                                //Console.WriteLine("\nThe actual default Proxy settings are {0}",myProxy.Address);
    //
    //                        }
    //                        else
                            {
                                    //使用自定的代码
                                    myProxy.Address=new Uri(String.Format("http://{0}:{1}",config.Proxy_Server,config.Proxy_Port));

                                    //myProxy.Credentials=new NetworkCredential(username,password);
                                    if (config.Proxy_Username.Length>0&config.Proxy_Pass.Length>0)
                                    {
                                            myProxy.Credentials=new NetworkCredential(config.Proxy_Username,config.Proxy_Pass);
                                    }

                                    请求.Proxy=myProxy;
                            }

                            //Console.WriteLine("\nThe Address of the  new Proxy settings are {0}",myProxy.Address);

             


                            //如果附带cookie 就发送
                            if ( this._cookiePost !=null)
                            {
                                    System.Uri u =new Uri(_strUrl);
                            //doenet处理cookie的bug:请求的服务器和cookie的Host必须一直,否则不发送或获取!
                                   
                                    //这里修改成一致!
                                    foreach(System.Net.Cookie c in _cookiePost)
                                    {
                                            c.Domain= u.Host;
                                    }

                                    请求.CookieContainer.Add(_cookiePost);
                            }

                            //如果需要发送数据,就以Post方式发送
                            if (_strPostdata !=null && _strPostdata.Length>0)
                            {
                                    请求.ContentType = "application/x-www-form-urlencoded";//作为表单请求
                                    请求.Method = "POST";//方式就是Post

                                    //发送http数据:朝请求流中写post的数据
                                    byte[] b= this._encoding.GetBytes(this._strPostdata);
                                    请求.ContentLength=b.Length;
                                    System.IO.Stream sw=null;
                                    try
                                    {
                                            sw=请求.GetRequestStream();
                                            sw.Write(b,0,b.Length );
                                    }
                                    catch (System.Exception ex)
                                    {
                                            this._strErr=ex.Message;
                                    }
                                    finally
                                    {
                                            if (sw!=null){sw.Close();}
                                    }

                            }
                            return 请求; //返回创建的请求对象

                    }

    /// <summary>
    /// 处理请求
    /// </summary>
    /// <returns>返回当前处理的文本</returns>
                    public string Proc()  
                    {
             
                            HttpWebRequest 请求=CreateRequest();//请求
                            HttpWebResponse 响应=null;;
                     
                            System.IO.StreamReader sr=null;

                                     
                            try
                            {
                                    //这里得到响应
       
                                    响应 =(HttpWebResponse)请求.GetResponse();
                
                                    sr=new System.IO.StreamReader(响应.GetResponseStream(),this.encoding);
                                     
                                    this._ResHtml=sr.ReadToEnd(); // 这里假定响应的都是html文本
                            }
                            catch (System.Exception ex)
                            {
                                    this._strErr=ex.Message;//发生错误就返回空文本
                                    return "";
                            }
                            finally
                            {
                                    if (sr!=null){sr.Close();}
                            }
                            //状态码
                            this._strCode=响应.StatusCode.ToString();

                            if (this._strCode=="302") //如果是302重定向的话就返回新的地址。
                            {
                                    this._ResHtml=响应.Headers["location"];
                            }

                            //得到cookie
                            if( 响应.Cookies.Count > 0)
                            {
                                    this._cookieGet =响应.Cookies; //得到新的cookie:注意这里没考虑cookie合并的情况
                            }
                            return this.ResHtml ;
                    }

                    /// <summary>
                    /// 加载验证码
                    /// </summary>
                    /// <returns>验证码的图象</returns>
                    public System.Drawing.Image LoadPWDext()
                    {
                            this.strUrl="验证码URL";
                            System.Drawing.Image img=null;
                            HttpWebRequest 请求=CreateRequest();
                            HttpWebResponse 响应=null;;
                            try
                            {
                                    响应 =(HttpWebResponse)请求.GetResponse();
                                    img=System.Drawing.Image.FromStream(响应.GetResponseStream());//直接作为stream创建图象。
                                    //得到cookie
                                    if( 响应.Cookies.Count > 0)
                                    {
                                            this._cookieGet =响应.Cookies;
                                    }
                            }
                            catch(System.Exception ex )
                            {
                             Console.WriteLine(ex.Message);
                            }
                            return img;
                    }


                    #region 构造函数
                    public HttpProc()
                    {
                    }

                    /// <summary>
                    /// 构造函数
                    /// </summary>
                    /// <param name="地址">发送的地址</param>
                    /// <param name="要发送的cookie">要发送cookies集合</param>
                    public HttpProc(string 地址,System.Net.CookieCollection 要发送的cookie)
                    {
                            this._strUrl=地址;
                            this._cookiePost=要发送的cookie;
                    }

                    /// <summary>
                    /// 构造函数
                    /// </summary>
                    /// <param name="地址">发送的地址</param>
                    /// <param name="发送数据">要发送的数据</param>
                    public HttpProc(string 地址,string 发送数据)
                    {
                            this._strUrl=地址;
                            this._strPostdata=发送数据;

                    }


                    /// <summary>
                    /// 构造函数
                    /// </summary>
                    /// <param name="地址">发送的地址</param>
                    public HttpProc(string 地址)
                    {
                            this._strUrl=地址;
                    }


                    /// <summary>
                    /// 构造函数
                    /// </summary>
                    /// <param name="地址">发送的地址</param>
                    /// <param name="发送数据">要发送的数据</param>
                    /// <param name="要发送的cookie">要发送cookies集合</param>
                    public HttpProc(string 地址,string 发送数据,System.Net.CookieCollection 要发送的cookie)
                    {
                            this._strUrl=地址;
                            this._strPostdata=发送数据;
                            this._cookiePost=要发送的cookie;
                    }
                    #endregion

                    #region 地址
                    private string _strUrl;
                    /// <summary>
                    /// 请求http的地址
                    /// </summary>
                    public string strUrl
                    {
                            get
                            {
                                    return _strUrl;
                            }
                            set
                            {
                                    _strUrl=value;
                            }
                    }
                    #endregion

                    #region 来源地址
                    private string _strRefUrl;
                    /// <summary>
                    /// 当前页面的引用地址
                    /// </summary>
                    public string strRefUrl
                    {
                            get
                            {
                                    return _strRefUrl;
                            }
                            set
                            {
                                    _strRefUrl=value;
                            }
                    }
                    #endregion

                    #region 数据
                    private string _strPostdata ;
                    /// <summary>
                    /// 发送出去的数据
                    /// </summary>
                    public string strPostdata
                    {
                            get{return this._strPostdata;}
                            set{this._strPostdata=value;}               
                    }
                    #endregion

                    #region 要发送的cookie集合
                    private System.Net.CookieCollection _cookiePost;
                    /// <summary>
                    /// 发送的cookie集合
                    /// </summary>
                    public System.Net.CookieCollection cookiePost
                    {
                            get
                            {
                                    return _cookiePost;
                            }
                            set{_cookiePost=value;}
                    }
                    #endregion

                    #region 获取的cookie集合
                    private System.Net.CookieCollection _cookieGet;
                    /// <summary>
                    /// 发送的cookie集合
                    /// </summary>
                    public System.Net.CookieCollection cookieGet
                    {
                            get
                            {
                                    return _cookieGet;
                            }
                    }
                    #endregion

                    #region 代理

                    private System.Net.IWebProxy _Proxy;
                    /// <summary>
                    /// 代理服务器
                    /// </summary>
                    public System.Net.IWebProxy Proxy
                    {
                            get{return this._Proxy;}
                            set{this._Proxy =value;}
                    }
                    #endregion

                    #region 是否发送成功
                    private bool _succeed;
                    /// <summary>
                    /// 是否执行成功
                    /// </summary>
                    public bool succeed
                    {
                            get {return _succeed;}
                            set {_succeed=value;}
                    }
                    #endregion

                    #region 响应的html结果
                    private string _ResHtml;
                    /// <summary>
                    /// 返回的html结果,以文本方式
                    /// </summary>
                    public string ResHtml
                    {
                            get
                            {
                     
                                            return _ResHtml;
                     
                                           
                            }
                    }
                    #endregion

                    #region 响应码
                    private string _strCode;
                    /// <summary>
                    /// 响应代码
                    /// </summary>
                    public string strCode
                    {
                            get {return _strCode;}
                            set {_strCode=value;}
                    }
                    #endregion

                    #region 错误文本
                    private string _strErr;
                    /// <summary>
                    /// 错误文本
                    /// </summary>
                    public string strErr
                    {
                            get {return _strErr;}
                            set {_strErr=value;}
                    }
                    #endregion

                    #region 编码
                    private System.Text.Encoding _encoding=System.Text.Encoding.Default;
                    public System.Text.Encoding encoding
                    {
                            get{return _encoding;}
                            set {_encoding =value;}
                    }
                    #endregion

            }
    }
    posted @ 2007-04-19 15:15 星光熠熠 阅读(132) | 评论 (0)编辑
    想杀人! 一个小问题弄了2个小时! 
    哎~ 以前的BLOG被关了好久了 ~ 虽然也没有写日志的习惯,但是还是可以放一些好的东东! 
    呵呵! 
    从今天开始,在CNBLOGS 里好好学习 天天上网!
    posted @ 2005-07-21 18:43 星光熠熠 阅读(102) | 评论 (0)编辑