|
|
February 06
Quote
朋友 & 兄弟
我在大学里面朋友不算很多.大概归于自己不太喜欢到处搞社交活动.可以扳手指数得清楚.兄弟的更加少的可怜,我怎能算都只有这几个
- 宛刚
- 吴敏
- 庄家栋 :叫胖胖叫惯了,居然忘了他名字,最后看手机,没有,看同学录没有[你没有给我签呢!],看群.....终于找到了.
- 新雨
- 桃子
- 志勇
January 25
我在大学里面朋友不算很多.大概归于自己不太喜欢到处搞社交活动.可以扳手指数得清楚.兄弟的更加少的可怜,我怎能算都只有这几个
December 25
一、 设计模式的隐喻 武功套路是习武的门径。新手要一招一式地练习套路,烂熟于心之后,熟能生巧,在实战之中即可见招拆招、运用自如——此时习武之人已从“新手”成长为“好手”。“高手”则没有套路,实战之中只有自然反应,然而一招一式浑然天成、恰到好处,似有似无、无中生有。“高手”之上还有“高高手”,他们达到的境界非我等凭借金氏武侠小说可以揣测。 设计模式之于设计,好比套路之于武术。“新手”要一个接一个地学习模式,“好手”能够活用模式,“高手”则没有模式。 设计模式的“内功”是面向对象的基本原则。这些原则是“神”,模式是“形”。高手拼的是“内功”,对面向对象基本原则有了深刻的领悟,才能用好设计模式,避免“走火入魔”。 一般在设计模式著作的前几章都会介绍面向对象的基本原则,这几章非常重要。学通了这几章,后面的模式就不过如此了。学完了设计模式,也最好翻过头来重新看看这几章,保证会有新的领悟。
二、 为什么使用设计模式 对任何设计都可以凭主观(对设计很难做出客观评价)判断得出它是一个好的设计,还是一个坏的设计。使用设计模式是为了避免坏的设计。Martin叔叔在他的著作《敏捷软件开发 原则、模式与实践》中描述了拙劣设计的症状:
僵化性(Rigidity):设计难以改变。 脆弱性(Fragility):设计易于遭到破坏。 牢固性(Immobility):设计难以重用。 粘滞性(Viscosity):难以做正确的事情。 不必要的复杂性(Needless Complexity):过分设计。 不必要的重复(Needless Repetition):过多的重复。 晦涩性(Opacity):混乱的表达。
三、 什么时候使用设计模式 Martin叔叔的书中有段话: 在学习它们(设计原则和模式)的时候,请记住,敏捷开发人员不会对一个庞大的预先设计应用那些原则和模式。相反,这些原则和模式被应用在一次次的迭代中,力图使代码以及代码所表达的设计保持干净。 在这段容易被读者忽略的文字中,我体会到这样几层含义:
代码是设计(这是Martin叔叔强调的一个观点,这个观点可以参考《敏捷软件开发 原则、模式与实践》一书的附录D); 设计模式是为了使设计适应变化; 设计模式是重构的工具; 设计一开始就要保持干净、简单,以后仍然要保持干净、简单; 不能过度使用设计模式。
使用设计模式的目的是为了适应未来的变化,变化之所以存在是因为它的不可预知性——如果可以预知,则不能称其为变化。如何判断哪些需求可能变化,哪些需求可能不变,并且在最大程度上保持设计的干净、简单,这是些工艺问题,而不是工程问题。既然是工艺问题,那么就只能给出原则,不能给出标准。使用设计模式的大体原则可能是:对未来极有可能发生变化的问题给出最简单、修改成本最低的解。 四、 避免过度使用设计模式 易维护的程序首先要易理解,这一点远甚于其他。在易理解的代码上才好维护。过分地使用设计模式会增加程序的复杂性和晦涩性,让程序不易理解,从而降低了程序的易维护性。 Switch语句曾经遭致诟病,许多重构的例子就是拿Switch开刀。我认为Switch语句是高效的语句,可以写出极优雅、简单的代码。在很多情况下,直接使用Switch语句比把它拆成若干个Class更“干净”。 再比如,有一段四百多行的代码负责整个系统的调度,如果未来的变化仅仅是修改这四百行代码而不会大量添加代码,那么把这四百多行代码集中在一个函数里面,比将它拆分成十来个Class更加容易维护。
五、 讨论几个具体的模式 1、 创建模式(Creational Pattern) 工厂(Factory Method)模式是常用的模式。工厂模式的应用情景明确,设计思想简单。从使用多态到只用一个静态方法,工厂模式的变化形式有很多。我习惯简单地使用工厂模式,也就是使用只有静态方法的工厂模式。下面的工厂模式代码简单、干净: MyFactory.GetClassInstance().DoFunction(); 类厂并不承载业务逻辑,需求变化对类厂的影响通常很小。因此使用重量级的工厂模式往往并不划算。一组包含层次关系的重量级的工厂类,可能意味着过度设计。 单例(Singleton)模式和工厂模式关系密切。从实现的角度讲,单例模式是工厂模式的一个特例,但是两个模式的应用情景不同,因此它们属于不同的模式。 抽象工厂(Abstract Factory)模式是工厂模式的推广。抽象工厂模式的应用情景更加特殊和严格。在一个使用抽象工厂的设计中,如果未来发生不同产品族各自演化的情形,那么抽象工厂模式就可能崩溃了。在实际应用中,不同产品族各自演化,最终分道扬镳的情形是有的,用户提出这样的需求的确让人“触目惊心”。在使用抽象工厂模式之前,一定要保证从现在到未来都能够用一致的方式使用这些产品族。 将工厂模式稍加变化可以得到建造(Builder)模式。工厂模式的“加工工艺”是隐藏的,而建造模式的“加工工艺”是暴露的。这点不同,使建造模式在更加灵活的同时也有失优雅。 2、 模板模式(Template Method)和策略(Strategy)模式 模板模式和策略模式的应用情景类似,但实现方式不同,前者使用继承,后者使用委托。 模板模式有可能是最“古老”的模式之一,在使用面向对象技术的早期,“继承”大行其道,很多设计人员可能不自觉地使用过模板模式。模板模式的缺点是把具体实现和通用算法紧密地耦合起来,使得具体实现只能被一个通用算法操纵。然而在继承关系中,父类的信息可以更多地暴露给子类,这种(违背面向对象设计原则的)微妙的沟通在一些特定应用中显得更加灵活和方便。 策略模式是委托的经典用法。策略模式消除了通用算法和具体实现的耦合,使得具体实现可以被多个通用算法操纵。策略模式也增加了类层次,比模板模式复杂。 模板模式和策略模式通常可以互相替换。它们都像试卷,模板模式是填空题,策略模式是选择题。 3、 简化问题的模式 门面(Facade)模式把一组复杂的接口隐藏在一个简单且特定的接口后面。 调停者(Mediator)模式把对象之间的引用关系包装在一个特定的容器里面。 组合(Composite)模式描述了整体与部分的结构关系,并且允许用一致的方式处理这个结构。 上面几个模式对使用者而言,都在一定程度上起到了简化问题的作用。 4、 扩展功能的模式 访问者(Visitor)模式和装饰(Decorator)模式都可以在不改变现有类结构的基础上,动态地增加功能。 访问者模式把现有类结构上的对象“分配”到一个名为访问者的类中,在访问者的相应方法中配置对象、改变对象或扩展功能。 装饰模式把现有类结构上的对象“注入”一个装饰类中,在装饰类中扩展它的功能。 访问者模式和装饰模式在实际效果上是不同的。访问者模式可以把对象分配到相应的方法里,从而对每个对象分别进行加工或扩展。而装饰模式只能用一致的方式对所有的被装饰对象进行加工或扩展,要想实现不同的加工或扩展,只能增加新的装饰类。 过多的“装饰类”有可能使业务逻辑分散,并且使程序结构复杂。针对每一个具体的派生类,“访问类”都要有一个对应的方法,增加派生类的时候也要增加访问类的方法。扩展功能的需求是经常发生的,是否有必要使用上述模式则值得再三考虑。 5、 其他常用的模式 桥梁(Bridge)模式。Class是封装了行为和属性的容器,然而Class的一组行为可能独立演化,这时最直接的想法是使用继承,把各不相同的行为封装在不同的子类里。桥梁模式从另外的角度解决了这个问题。桥梁模式把独立演化的行为封装在另外一个类体系里,与原来的类体系分别独立演化,两个类体系在抽象层次是“使用”关系。在很多OO教材里面用Shape类封装属性和Draw方法,在桥梁模式里,“形状”和“画笔”是两组独立演化的类体系,在抽象层次,“形状”使用“画笔”绘制自己。 适配器(Adapter)模式是常用模式,它比较简单,有时和其他的模式配合使用。 命令(Command)模式被Martin称为“最简单、最优雅的模式之一”。命令模式的魅力在于它为每个类“培训”出了相同的技能,经过“培训”的类“柔性”更强,能够产生不可思议的能力。 6、 不太需要的模式 观察者(Observer)模式。Java和C# 都实现了观察者模式。 迭代子(Iterator)模式。在Java和C#语言里,可以用聚集类代替。 备忘录(Memento)模式。可以用Class的序列化能力代替。 责任链(Chain of Responsibility)模式。可以用其他的方式替代,例如观察者模式、语言本身提供的消息机制等。 解释器(Interpreter)模式。个人认为,它是个算法,不是模式。 代理(Proxy)模式。如果在一开始就知道某些底层策略一定会被替换掉,那么使用代理来隔离这些策略还是有必要的。否则,几乎没有使用的必要。 参考文献: Robert C. Martin,Agile Software Development Principles,Patterns,and Practices.(中译本:《敏捷软件开发 原则、模式与实践》,邓辉译,清华大学出版社,2003年)
作者: 张昱 曾就职于浪潮集团、联想集团,现就职于中科院电子所。超过十年的软件工作经验。对分析设计、项目管理、编程实践有着浓厚的兴趣。
Martin叔叔没有给出“好”设计的定义。避免了上述症状的设计可能是个符合要求的设计,但未必是“好”设计。软件设计具有“艺术”特征,一个好的设计必定妥当、优雅、满足需求,妥当、优雅、满足需求的设计则未必一定是好的设计。设计模式的使用是为了消除软件设计的恶劣症状,而不是保证给出一个好的、正确的设计。设计模式可能源于人们对软件的恐惧感吧(林星的文章中有句话:方法论源于恐惧)。 Martin叔叔在接下来的一章(第七章、什么是敏捷设计)中对上述拙劣设计的症状进行了详细描述。我们看到,产生上述恶劣症状的根本原因都是需求变化。使用设计模式是为了消除设计的恶劣症状,而产生恶劣症状的根本原因是需求变化。那么是否可以这样说:使用设计模式是为了拥抱变化。
http://club.sooyie.com/blogs/wuzi/archive/2006/10/18/http_3A002F002F00_www.bloger.com.cn_2F00_user4_2F00_164028_2F00_.aspx CommunityServer 2.x
是开放源码,其实 CommunityServer 的前身是 ASP.NET Forums,2.3 这个版本是国内人汉化,并做了一些改进。真正官方已经转到 CommunityServer 上面了,CS 2.x 包含了博客、相册、新闻、文件共享、RSS等新功能,功能不少,看看代码,更是多,汉化起来倒不麻烦,改一下 XML 文件就行了,公司产品的社区准备采用 在 CommunityServer 2.x 的基础上来改造。
这个程序是开源的,由很多人做出来的,很规范,可以从这些代码中,学习到很多好的开发思想。这个程序为了使用皮肤,用框架来构建出来了整个应用,确实灵活了很多。另外程序大量使用了控件,包括自定义服务器控件和网页控件,代码都是直接写在 ASPX 文件中,没有使用 CodeBehind 技术,因为网页上面几乎不用写什么代码了,都在自定义服务器控件中了。 http://club.sooyie.com/blogs/wuzi/archive/2006/10/09/_A563E3538476C87ED37EE389CA91_-.aspx 简单的说接口就是一个契约或者规范。比如遥控器,国家出台了一个国家遥控器规范,明文要求所有的遥控器厂家都要遵循这个规范,如果不遵循规范就不给3C认证标志,就不允许上市出卖。为什么要这个规范呢?大家在时间生活中会经常碰到,甲厂的遥控器不能遥控乙厂的电视,电视遥控器不能遥控其它电器如空调,冰箱!原因是什么呢?是各个遥控器都没有遵循一个规范,电波有长有短,电压有高有低,导致各自为政,四分五裂。 可以想像出国家遥控器标准只是是规定遥控器的一些重要技术指标,比如要发射波应该多长,电压应该多高……但它绝对不会规范出遥控器的材质、形状、重量和颜色,也就是说规范把所有同遥控无关的东西都抛弃了!每个遥控器厂家只要遵循了规范,那么对遥控器可以有任意的诠释。比如A厂可以用铁做,牢固无比,B厂可以用纸,可以任意折叠,anyway,不管用什么做,做出什么样子,只要遵循规范的遥控器就可以遥控所有的电器(当然电器厂家也要遵循一定的规范),甚至可以遥控导弹发射!利害吧,这就是接口的威力! 再详细点,接口就是一个规范,他和具体的实现无关!接口是规范(虚的),他只是一张纸,也是说在实际的使用中接口只有依托一个实现了它的类的实例,才会有意义,如上面的各个厂家做的遥控器产品。每个实现接口的类(厂家)必需实现接口中所有的功能。一旦一个类实现了一个接口,就可说一个类和接口捆绑了(这个很重要,做题目的时候会用到)
来个例子 interface 遥控器规范 //国家定义的遥控器规范,每个遥控器厂家必需实现(诠释)它 { int 波长(); int 电压(); } class 甲厂铁遥控器 : 遥控器规范 //甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了 { public int 波长(); //规范上定义的指标 public int 电压(); //规范上定义的指标 public int 形状() { 正方形 }; //甲厂自己对该产品的诠释 public int 材质() { 铁 }; //甲厂自己对该产品的诠释 } class 乙厂纸遥控器 : 遥控器规范 //甲厂的遥控器实现(诠释)了这个规范,它和遥控器规范捆绑了!好,它可以在市场上出售了 { public int 波长(); //规范上定义的指标 public int 电压(); //规范上定义的指标 public int 形状() { 圆形 }; //甲厂自己对该产品的诠释,是圆形 public int 材质() { 纸 }; //甲厂自己对该产品的诠释,用纸做,好酷! } class 电器 { procedure 接收遥控(遥控器规范) //电器上,接收遥控指令 {..... 接收(遥控器规范.波长) ; 接收(遥控器规范.电压); .....} } static main() { 甲厂铁遥控器 ControlA ; //申明控制器对象 乙厂纸遥控器 ControlB ; ControlA = new 甲厂铁遥控器(); //实例化控制器对象,这个时候系统在托管堆中为该对象分配了空间 ControlB = new 乙厂纸遥控器() ; 遥控器规范 ControlInterfaceA = (遥控器规范)遥控器1 ; //把对象实例转换成一个规范,为什么呢?因为"我家的电器".只能识别遥控器规范,它识别不到具体的遥控器 遥控器规范 ControlInterfaceB = (遥控器规范)遥控器2; //同上 电器 我家的电器 = new 电器(); 我家的电器.接收遥控(ControlInterfaceA) //我用甲厂遥控器遥控我家的电器. 注意: 这里的ControlInterfaceA是不能单独存在的,它必要依赖实现了"遥控器规范"的类的实例"ControlA".道理很简单,接口是一个指针,不会被分配空间,你就无法使用,只有和一个具体类的实例联系了,才有了可以活跃空间. 我家的电器.接收遥控(ControlInterfaceB) //我用乙厂遥控器遥控我家的电器 ... //下面是我的的想像,我可以用遥控器来控制导弹发射! 我的导弹.接收遥控(ControlInterfaceA); 我的导弹.接收遥控(ControlInterfaceB); ... } -------------------------------------------------------------------- 接口的执行 好了,有了接口的概念,再来谈 C# 程序在运行中是如何使用接口的,如何访问接口函数。具体流程如下 A、当调用一个接口的函数时,系统会去检查这个接口对应实例是什么。 B、找到这个实例后,再去找这个实例对应的实例类是什么。 C、根据这个实例类去检查该实例类是否和接口发生了捆绑(看是否实现了该接口,冒号后面就是) D、好!如果实例类实现了该接口(发生了捆绑),它就在这个实例类中找函数的定义。然后执行该函数。执行结束。 E、如果没找到,他就继续往父类找,直到找到第一个和接口捆绑的父类为止。 F、找到后,它再检查该函数是否是虚拟函数。 G、如果不是,他马上就执行它。 H、如果是,麻烦了,系统又要从头来过,去检查该实例类的函数是否重载了该函数。
例子:
using System;
namespace ConsoleApplication1 { /**//// <summary> /// Class1 的摘要说明。 /// </summary> public interface I { void Func(); } class A :I { public virtual void Func() { Console.WriteLine("FuncA"); } } class B : A , I //注意这里的意思? { public void Func() { Console.WriteLine("FuncB");} } class C : A { public override void Func() { Console.WriteLine("FuncC");} }
class Class1 { /**//// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { I a = new A() ; //申明了接口a,并马上和一个类的实例发生关系了 I b = new B() ; //申明了接口b,并马上和一个类的实例发生关系了 I c = new C() ; //申明了接口c,并马上和一个类的实例发生关系了 a.Func() ; //检查a的实例A, 发现A和接口I捆绑了,所以执行A的函数Func ,结果: FuncA b.Func() ; //检查b的实例B, 发现B和接口I捆绑了,所以执行B的函数Func ,结果: FuncB c.Func() ; //家常c的实例C,发现其没有和接口I捆绑,系统继续找它的父类. 发现A和I捆绑了,他就去找函数A,发现A是虚拟函数,系统又从头来找类的实例C,发现C重载(override)了Func,好了,马上执行该函数. 结果是FuncC; Console.ReadLine(); } } }
October 29 我为什么要来北京?
这个问题很难回答,但是还是要说的:
1.北京的发展比长沙好:
无论从什么方面说,北京的各类方面要比长沙的要好.虽然长沙也在高速发展中.我不在广西,既然要出来闯,那我到北京自然要比在长沙好
2.未玩待续
好久没写了,一方面是客观原因自己没有时间,一方面是自己也不想写,不知道自己要写什么,
虽然很多想法,但是都很不成熟,也没有想写的欲望了
但是我还是想感谢我的女朋友了.如果不是她的支持,我都不知道自己怎么走下去了...............
我的好朋友吴敏来北京了. 我今天看到他的时候,我吓了跳,虽然我知道他比较累,但是看到他那样瘦,我还是不能相信我的眼睛.
我们分开快两个月了,虽然都没有什么联系,但是我相信他的能力,相信他的运气,但是还是没有想到他会那样的累.心里很不是滋味.
高高的颧骨顶他的脸蛋,整个脸都是皮.我想这些都是他通宵所导致的,加上营养不够好,哎,这些都让他累的.有时候我也想.如果是我自己能不能努力到他那样地步恩?
我估计是不行的.我虽然不怕苦,但是这样高强度的和高压力下的通宵.我会受不了的,佩服他了. 
January 12 rosemarry也许是我自己太看不起自己了吧!或许是自己太不愿意让自己从小做起了.或许没有或许..我只是很不甘心为什么我自己不能够做到应该做的时期呢,为什么我的付出没有得到相应的回报呢?很多晚上我都对着月亮一遍一遍的问自己,我没有足够的努力我没有足够的去做么?为什么我不能和其他人一样,只经过一点努力就能达到目标,我相信这个世界上一定会有这样一种方法:任何事情都由他的捷径!我就是不明白为什么我都没有找到呢!!!!!!!!!!!!!!!!!!!! 我对着苍天问:为什么我没有找到!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! baidu一下吧 夜也深了。刚刚和老四qq完有点累了.
大学四年就要过去了.怎么也不明白四年自己变了怎样多,回头看看自己的脚步,发现很多做过事情,都是自己曾经深恶痛绝的,或许这个就是人们常常说的人在江湖身不由己,啊! 又给自己找借口了,埃.突然觉得这个世界好像就是这样变化的,
人都可以变的吧,自我安慰一下,堕落的时间越来越多了,这样是不行的 January 06
1. 在已经登录的状态,点击[编辑您的共享空间] 进入后台。
2. 在当时浏览器地址栏现有的地址后面添上“ &powertoy=sandbox ”然后按回车。进入新的页面(页面看起来没有变化)。
3. 点[自定义]菜单,得到到一个横条式的目录。 再点[模块],得到下拉菜单, 在下拉菜单里选择添加模块 PowerToy: Custom HTML,此时在所编辑页面内会出现一个新的模块。标题名称为 Custom HTML。 拖动这个模块至你想要置放的位置。(通常是页面的最上方) 置放完毕,按上方[保存]按钮,你会发现 “ Custom HTML ”模块已经出现在那里,这时可以在该模块内输入任何 HTML 的脚本代码
4.把您在计数器网站里申请的代码直接输入进去就可以了!
- 进入 MSN Spaces 的编辑页面。
- 在编辑页面的地址(这时在地址栏中显示的地址)后面附加上“ &powertoy=musicvideo ”后回车。(就是你的MSN空间的地址后面加上“ &powertoy=musicvideo ")
举例:比如我的在空间点了编辑以后页面的地址为“http://spaces.msn.com/members/loucson/PersonalSpace.aspx?_c02_owner=1&_c=”加上“ &powertoy=musicvideo ”就等于“http://spaces.msn.com/members/loucson/PersonalSpace.aspx?_c02_owner=1&_c=&powertoy=musicvideo ”然后按回车。
- 新的页面载入后,点击“自定义”,在模块的下拉菜单中就有一个新的“PowerToy:Windows Media Player”(原来是没有的项目),点击一下增加,然后保存。
- 这样就会有一个新的模块 Window Media Player,目前该模块只有英文界面。
- 注意媒体文件的地址 URL,只支持 WMA, WMV, WAV, AVI, MPG, MPEG, MP3 格式(也不支持播放列表),除外的格式将无法正常保存,导致预览时播放器的按钮为灰白。
- 如果想页面载入时自动播放的话,只需勾上 Auto Start。其他参数如播放次数和播放器的外观等默认无妨。
- 这样,你的 MSN Spaces 就有了在线播放器的功能了。
January 02 1.长相不令人讨厌,如果长得不好,就让自己有才气;如果才气也没有,那就总是微笑。 2.气质是关键。如果时尚学不好,宁愿纯朴。 3.与人握手时,可多握一会儿。真诚是宝。 4.不必什么都用“我”做主语。 5.不要向朋友借钱。 6.不要“逼”客人看你的家庭相册。 7.与人打“的”时,请抢先坐在司机旁。 8.坚持在背后说别人好话,别担心这好话传不到当事人耳朵里。 9.有人在你面前说某人坏话时,你只微笑。 10.自己开小车,不要特地停下来和一个骑自行车的同事打招呼。人家会以为你在炫耀。 11.同事生病时,去探望他。很自然地坐在他病床上,回家再认真洗手。 12.不要把过去的事全让人知道。 13.尊敬不喜欢你的人。 14.对事不对人;或对事无情,对人要有情;或做人第一,做事其次。 15.自我批评总能让人相信,自我表扬则不然。 16.没有什么东西比围观者们更能提高你的保龄球的成绩了。所以,平常不要吝惜你的喝彩声。 17.不要把别人的好,视为理所当然。要知道感恩。 18.榕树上的“八哥”在讲,只讲不听,结果乱成一团。学会聆听。 19.尊重传达室里的师傅及搞卫生的阿姨。 20.说话的时候记得常用“我们”开头。 21.为每一位上台唱歌的人鼓掌。 22.有时要明知故问:你的钻戒很贵吧!有时,即使想问也不能问,比如:你多大了? 23.话多必失,人多的场合少说话。 24.把未出口的“不”改成:“这需要时间”、“我尽力”、“我不确定”、“当我决定后,会给你打电话”…… 25.不要期望所有人都喜欢你,那是不可能的,让大多数人喜欢就是成功的表现。 26.当然,自己要喜欢自己。 27.如果你在表演或者是讲演的时候,如果只要有一个人在听也要用心的继续下去,即使没有人喝采也要演,因为这是你成功的道路,是你成功的摇篮,你不要看的人成功,而是要你成功。 28.如果你看到一个贴子还值得一看的话,那么你一定要回复,因为你的回复会给人继续前进的勇气,会给人很大的激励。同时也会让人感激你。 December 18 今天有空随便把那个区位码的东西做成服务罢..但是遇到一个该死的问题.哈哈不过最后还是解决了啦........................................
在应用程序中 调用web service服务(framework 2.0) 得做一个无赖的事情就是把访问权利给 DefaultCredentials 分配给 Web 服务客户端代理的 Credentials 否则,怎么样都不能让你access:
The request failed with HTTP status 401: Access Denied
完整代码如下
localhost.Service service = new global::Character.localhost.Service(); service.Credentials = System.Net.CredentialCache.DefaultCredentials;
|
|
|
|