posts - 48,  comments - 14,  trackbacks - 0
 
1. I have been for over five years in teh employ of an exporting company.
  
  本人曾经前后五年被受雇于出口贸易公司。
  
  2. I have been in the business for the last ten years, and worked as the superintendent in the personnel department.
  
  本人在过去十年在商界担任人事部主任迄今。
  
  3. I have had five years‘ experience with a company as a salesman.
  
  本人曾在某一公司担任推销员,前后有五年之久。
  
  4. For the past three years, I have been in the office of the Brothers Trading Co., where I have been ad still am an accountant.
  
  本人曾经在兄弟贸易公司服务三年,担任会计工作,现仍在职中。
  
  5. I am twenty years of age, and have been employed for the last two years by the Green Trees Co., in teh general clerical work of the office.
  
  我今年20岁,曾于绿林公司服务两年,担任一般文员工作。
  
  6. I am 25 years of age, and have had two years‘ experience in my present post, which I am leaving to better myself.
  
  我今年25岁,已在目前的职位工作两年,兹为寻找更上一层楼,准备离开此职位。
  
  7. I am nineteen years of age, female and have had two years‘ experience in a company‘s delivery office.
  
  我今年19岁,女性。曾在某家公司担任收发工作两年。
  
  8. I am just leaving school, and am eighteen years of age.
  
  本人18岁,不久即可毕业。
  
  9. I am twenty years of age, and am anxious to settle down to office work.
  
  本人20岁,希望能找到一个公司,以便安定下来。
  
  10. Since my graduation from the school two years ago, I have been employed in teh Green Hotel as a cashier.
  
  两年前,自从离校后,在格兰酒店担任出纳员。
posted @ 2006-03-09 10:34 逍遥草 阅读(495) | 评论 (1)编辑 收藏
http://www.51ielts.com 2005-1-22 来源: 【无忧雅思网】


Michael Needjobs
3221 Need Job Street
North York, ON
V5R 5B7
Tel.(416) 123-4567

--------------------------------------------------------------------------------

OBJECTIVE: Seeking a challenging position as System Analyst with a growth-oriented organisation where my skills, experience will be utilised to their full potential.

WORK EXPERIENCE:

May 1994-Present Employer: BEST SYSTEM INC., Markham, Ontario

Position: System Analyst

designed and implemented complex GUI and RDBMS applications under WINDOWS NT environment using Visual C++, MFC, C, Visual Basic 4, SQL Server 6, Access 2.0
member of a development team for a large client server (three tier) relational database application using Visual Basic, remote automation, remote databases and SQL server under WINDOWS NT environment.
redeveloped and reengineered several applications of serial communication and databases

1993 - Apr.1994 Employer: SINUS INTERNATIONAL INC., Toronto, Ontario

Position: Programmer Analyst

designed, developed and tested communication software written in C for DOS and UNIX, based on custom communication protocol
designed relational database applications on UNIX environment
supported and managed the activity of a Novell network
1991-1993 Employer: ALEGRA Ltd, Oradea, Romania

Position: R&D Engineer

designed and developed structured software applications in C (DOS/WINDOWS), C++, Pascal
designed database applications dBase and Fox-Pro
co-ordinated and supervised the whole activity in a NOVELL computer network
taught public courses 10 hours/week about computer programming
July-Sept. Environment: University of Coimbra (Portugal)

1990 Position: R&D Engineer

summer courses on data transmission, remote connections to servers, Internet

--------------------------------------------------------------------------------

PERSONAL STRENGTHS:

six years of extensive work experience in various aspects of computer programming, analysis, developing and testing
able to optimise programs, to use difficult algorithms and protocol specifications, to work in a team environment or unsupervised
able to co-ordinate the analysis and production a development team
excellent programming abilities in C (DOS & UNIX), Visual C++, Visual Basic, SQL server, Access
very good working knowledges with computer networks (Novell and TCP/IP)
well-organised, efficient, quick learner, self-motivated and excellent mathematics background
excellent ability to plan, organise, prioritise my work and to meet on time the deadlines
EDUCATION AND TRAINING:

1986-1991 Computer and Control Engineering Faculty
University of Timisoara/Romania
Master of Science Degree in Computer Engineering

1991-1994 International Business Relations Faculty
University of Timisoara/Romania

1995 Seneca College - Advanced C++ Course
Microsoft - Advanced C++ Course

PAPERS, DISSERTATIONS AND AWARDS:


1986-1989 prizes at the Graduate Student National Mathematics Contest
June 1994 Member in Romanian Engineers Association
SPECIAL INTERESTS:


Object Oriented Programming, Numerical Models, Data Communication
HOBBIES:

Hiking, tennis, music and reading
LANGUAGES:

English, French, German and Romanian
REFERENCES:

Available upon request

posted @ 2006-03-09 10:33 逍遥草 阅读(777) | 评论 (0)编辑 收藏
英语面试一般包括三轮

  chie介绍说,第一轮面试一般由公司人力资源部的人员担任考官,他们会从你的个人简历出发,询问一些有关个人的问题,比如请你用英语做一个自我介绍。有些公司也会有一部分英语笔试,主要考查应聘者基本的语言运用能力。

  第二轮面试则由部门主管经理出面,这时候有关业务方面的问题成了面试的重点,所以英语面试也从个人情况转向了专业领域。比如应聘市场部,则应聘者通常会被要求谈一谈以往最成功的一个案例,或者自身的业务强项等。

  如果前面都很顺利,那么,最后一轮面试一般就是和公司的总裁面对面了。外企的总裁一般是老外,当然面试就变成全英语的了。总裁询问的问题一般会和公司的精神、企业文化有关。

  面试中最需要自信

  普华永道人力资源部经理姜周红介绍说,一般在进行英语面试时,多是希望考查应聘者听说读写的实际操作能力。小组讨论是英语面试的重要一环,一般来说,小组讨论形式的面试其目的主要是要了解应聘者在团体中的工作反应。进一步说,面试官更多的是希望了解应聘者面对指责的态度。

  姜周红说,在外企的面试中,除了笔试之外,面试中的英语部分以考查应用能力为主,所以应聘者在面试当中最需要的是自信、敢说。不妨尽量采用简短明了的词汇来表达自己的意思。另外,切忌在面试当中抬高自己贬低别人。回答问题尽量自然,并作为小组成员之一在自己的负责范围内答题,也不要重复其他应聘者的答案。说话要流利,思维要连贯,层次要清晰,不要夹杂中文,可以用“well”、“however”这样的过渡词来给自己停顿和思考,同时,也使得自己的表述显得口语化一些。

  面试前了解一下企业文化

  新橙英语培训中心专业商务面试课程教师chie建议说,学生的先期准备主要是个人情况和业务方面。专业英语的准备要充足,有时会被要求用英语解释一个专业术语或解答一个技术问题。所以,在面试前不妨去公司的英文网站了解一下企业文化,这对与老板面谈会有帮助的。

  chie介绍说,英语面试目前的趋势是通常设在一个类似于接待室的地方,而非特别准备的会场,由2-3个人负责面试。

  外国人作为考官进行面试时,由于他们与我们的思维方式、习惯以及文化有所差别,因此必须熟悉他们的理解方式和语言表达方式。不同公司对外语水平的要求不同,有的只具备用外语接听电话的水平即可,也有的要求用外语从事一般性工作。因此,应聘者必须准确了解应聘公司的外语使用程度和目的等信息后,再做出相应的对策。

  英语面试实战指南

  I:Interviewer(面试者)A:Applicant(求职者)

  介绍教育背景:简明扼要,实话实说

  尽管你在简历中对自己的教育背景作了介绍,但在面试时,面试官还有可能就此方面提问。还是事先做点准备吧。

  ①Iwhat is your major﹖

  AMy major is Business Administration. I am especially interested in″Marketing″.

  (不仅回答了问题,还顺带一句介绍了自己较为感兴趣的方面,简明扼要。)

  ②IWhich university are you attending﹖

  AI am attending×××University.

  ③IHave you received any degrees﹖

  AYes. FirstI received my Bachelor degree in English Literatureand then an MBA degree.

  ④IWhat course did you like best﹖

  AProject Management. I was very interested in this course when I was a student. And I think it's very useful for my present work.

  ⑤IDo you feel that you have received a good general training﹖

  AYesI have studied in an English train-ing program and a computer training program since I graduated from university. I am currently studying Finance at a training school. 介绍工作经验:显露实力,避免炫耀

  ①IHave you ever been employed﹖

  ②IYour resume says you have had one-year experience working in a foreign representative office in Shanghaimay I ask why you left﹖

  AI worked in a foreign rep.office for one year.HoweverI left there two years ago because the work they gave me was rather dull.I found another job that is more interesting.

  ③IHave you done any work in this field﹖

  ④IWhat qualifications do you have that make you feel you will be successful in your field﹖

  ⑤IWhat have you learned from the jobs you have had﹖

  AI have learned a lot about business know how and basic office skills. In additionI learned at my previous job show to cooperate with my colleagues.

  ⑥IWhat's you major weak point﹖

  AI haven't been involved in international businessso I don't have any experiencebut I have studied this course in the International Business Training Center of the×××Company.

  ⑦IWhat are your greatest strengths﹖(实话实说好了,不必客气,但应注意语气和表情,不要给人炫耀之感。)

  ⑧IPlease tell me about your working experience.

  ⑨IDoes your present employer know you are looking for another job﹖

  ANoI haven't discussed my career plans with my present employerbut I am sure he will understand. 性格爱好:表现积极、合作的一面

  ①IHow do you spend your spare time﹖

  ②IAre you interested in sports﹖

  ③IDo you think you are introverted or extroverted﹖

  ④IWhat kind of personality do you think you have﹖

  AI always approach things very enthusiastically. When I beg in somethingI don't like to leave it halfdone. I can't concentrate on something new until the first thing is finished.

  ⑤IWhat is the most important thing for you to be happy﹖

  ADifferent people have different ideas. I think the most important thing for me is having a good relationship with my family members and my friends. My family has always been very closeknitand my friend sand I spend a lot of time together. Without that I would be much less happy than I am.

  ⑥IWhat makes you angry﹖

  ADishonesty. It's unacceptable.

  ⑦IWhat are your personal weaknesses﹖

  AI'm afraid I'm a poor talker. I'm not comfortable talking with the people whom I have just met for the first time. That is not very good for businessso I have been studying public speaking.

  ⑧IAre you more of a leader or a follower﹖

  AI don't try to lead people. I'd rather cooperate with everybodyand get the job done by working together. 工作要求:我能胜任

  ①IDo you think you can make yourself easily understood in English﹖

  AYesin most circumstances.

  ②IAre you available for travel﹖

  AYesI like traveling. I am youngand unmarried. It's no problem for me to travel frequently.

  ③IHow about overtime work﹖

  AOvertime work is very common in companies. I can work overtime if it's necessarybut I don't think we will work overtime everyday.

  ④IHow long do you think we can depend on your working here﹖

  ⑤IDo you like regular work﹖

  ANoI don't like regular work. I am interested in different projects with new opport unities and new challengebut I can do regular work if the company needs me to do so.

  ⑥IWhat salary do you expect﹖

  AShall we discuss my responsibilities with your company first﹖I think salary is closely related to the responsibilities of the job.

  ⑦IDo you work well under pressure﹖

  AWorking under pressure is exciting and challenging. I don't mind working under pressure. I work well under the secircum stances. People canI Can.

  ⑧IDo you have any particular conditions that you would like the company to take into consideration﹖

  ANonothing in particular.

  ⑨IHow soon can you begin working for us﹖

  AI need about two to three weeks for necessary formalities. I will quit then transfer to your company. 面试结束:礼貌道别

  ①IAny questions﹖

  AWhen will I know your decision﹖

  ②IHow can we get in touch with you﹖

  ③IWe will notify you of our decision by mailis this convenient for you﹖

  ④IThank you for your interest in our company.

  AThank youMr.Smith. Goodbye.Thank you for your time.

  ⑤IYou will be hearing from us very soon. Please send the next applicantin on your way out.

  AOK.Thank you very much.

  此外,面试官还可能问及你的家庭情况,如家人对你的影响等,也应事先有所准备。

 

资料:

 

英语自我介绍常用十句话

1. I have been for over five years in teh employ of an exporting company.

  本人曾经前后五年被受雇于出口贸易公司。

  2. I have been in the business for the last ten years, and worked as the superintendent in the personnel department.

  本人在过去十年在商界担任人事部主任迄今。

  3. I have had five years' experience with a company as a salesman.

  本人曾在某一公司担任推销员,前后有五年之久。

  4. For the past three years, I have been in the office of the Brothers Trading Co., where I have been ad still am an accountant.

  本人曾经在兄弟贸易公司服务三年,担任会计工作,现仍在职中。

  5. I am twenty years of age, and have been employed for the last two years by the Green Trees Co., in teh general clerical work of the office.

  我今年20岁,曾于绿林公司服务两年,担任一般文员工作。

  6. I am 25 years of age, and have had two years' experience in my present post, which I am leaving to better myself.

  我今年25岁,已在目前的职位工作两年,兹为寻找更上一层楼,准备离开此职位。

  7. I am nineteen years of age, female and have had two years' experience in a company's delivery office.

  我今年19岁,女性。曾在某家公司担任收发工作两年。

  8. I am just leaving school, and am eighteen years of age.

  本人18岁,不久即可毕业。

  9. I am twenty years of age, and am anxious to settle down to office work.

  本人20岁,希望能找到一个公司,以便安定下来。

  10. Since my graduation from the school two years ago, I have been employed in teh Green Hotel as a cashier.

  两年前,自从离校后,在格兰酒店担任出纳员。

 

自我介绍用语大全之问候类

1.Good morning everyone.
大家早上好。
2.Good afternoon, ladies and gentlemen.
先生们,女士们下午好。
3.Good evening, teachers and fellow students.
老师们,同学们晚上好。
4.It’s my great honor to introduce myself to you here.
很荣幸在这儿向大家作自我介绍。
5.It’s my pleasure to introduce myself to you here.
我很高兴在这儿向大家作自我介绍。  
6.I’m very happy to introduce myself to you here.
我很高兴在这儿向大家作自我介绍。  
7.I’m very glad to introduce myself to you here.
我很高兴在这儿向大家作自我介绍。
8.I feel very honored to introduce myself to you here.
我感到很荣幸在这儿向大家作自我介绍。
9.It is a great pleasure for me to introduce myself to you here.
我是如此的高兴在这儿向大家作自我介绍。
10.It is a privilege to be speaking to you today.
今天能跟你谈话真是我三生有幸。
11. I am very proud to be addressing you this evening.
今晚能在此应邀讲话我深感荣幸。

 

范文:

 

考研英语复试之英语自我介绍

 

pesonel statement(introduction)

  good morning,my dear teachers,my dear professors.i am very glad to be here for your interview.my name is song yonghao,i am 22 years old .i come from luoyang,a very beautiful aicent city.my undergratuade period will be accomplished in chang'an university in july ,2004;and now,i am trying my best for obtaining a key to tongji university.

  generally speaking ,i am a hard working student especially do the thing i am interested in. i will try my best to finish it no matter how difficult it is. when i was sophomore, i found web design very interesting, so i learned it very hard . to weaver a homepage for myself, i stayed with my pesonel computer for half a month.,and i am the first one in my class who own his homepage. forthermore,i am a person with great perserverence. during the days preparing for the first examination,i insist on running every day, no matter what the weather was like.and just owning to this,i could concentrate on my study and succeeded in the end.

  well ,in my spare time ,i like basketball, tennis and chinese chess. also english is my favorate.i often go to english corner to practise my oral english on every thursday,and write compositions to improve my witten ability .but i know my english is not good enough ,i will continue studying.

  ok, that is all,thank you for your attention.

  my hometown------luoyang

  i am from luoyang,a beautiful city in henan province. it is famous as the "capital of nine dynasties " and enjoy yhe honer that luoyang peony is the best in the world.

  luoyang played a very important role in chinese history. so it has a profound cultural background and many great heritagesites have been well reverved. such as longmen grotto, one of the three grottoes in china ang white horse temple, being regarded as the cradle of chnese buddhism.

  luoyang peony is world-famous. every year, many tourists travel to luoyang to see the beauty of peony .the people in my hometown are friendly, they welcome the travellers from all over the world.

  i like my hometown very much.

 

 

考研面试英语口语自我介绍

good morning, my name is jack, it is really a great honor to have this opportunity for a interview, i would like to answer whatever you may raise, and i hope i can make a good performance today, eventually enroll in this prestigious university in september. now i will introduce myself briefly,i am 21 years old,born in heilongjiang province ,northeast of china,and i am curruently a senior student at beijing XX uni.my major is packaging engineering.and i will receive my bachelor degree after my graduation in june.in the past 4 years,i spend most of my time on study,i have passed CET4/6 with a ease. and i have acquired basic knowledge of packaging and publishing both in theory and in practice. besides, i have attend
several packaging exhibition hold in Beijing, this is our advantage study here, i have taken a tour to some big factory and company. through these i have a deeply understanding of domestic packaging industry. compared to developed countries such
as us, unfortunately, although we have made extraordinary progress since 1978,our packaging industry are still underdeveloped, mess, unstable, the situation of employees in this field are awkard. but i have full confidence in a bright future
if only our economy can keep the growth pace still. i guess you maybe interested in the reason itch to law, and what is my plan during graduate study life, i would like to tell you that pursue law is one of my lifelong goal,i like my major packaging and i won't give up,if i can pursue my master degree here i will combine law with my former education. i will work hard in thesefields ,patent ,trademark, copyright, on the base of my years study in department of p&p, my character? i cannot describe it well, but i know i am optimistic and confident. sometimes i prefer to stay alone, reading, listening to music, but i am not lonely, i like to chat with my classmates, almost talk everything ,my favorite
pastime is valleyball,playing cards or surf online. through college life,i learn how to balance between study and entertainment. by the way, i was a actor of our amazing drama club. i had a few glorious memory on stage. that is my pride

 

英文自我介绍三

General Introduction*
I am a third year master major in automation at Shanghai Jiao Tong University, P. R. China. With tremendous interest in Industrial Engineering, I am writing to apply for acceptance into your Ph.D. graduate program.
Education backgroundIn 1995, I entered the Nanjing University of Science & Technology (NUST) -- widely considered one of the China’s best engineering schools. During the following undergraduate study, my academic records kept distinguished among the whole department. I was granted First Class Prize every semester, and my overall GPA(89.5/100) ranked No.1 among 113 students. In 1999, I got the privilege to enter the graduate program waived of the admission test. I selected the Shanghai Jiao Tong University to continue my study for its best reputation on Combinatorial Optimization and Network Scheduling where my research interest lies.
At the period of my graduate study, my overall GPA(3.77/4.0) ranked top 5% in the department. In the second semester, I became teacher assistant that is given to talented and matured students only. This year, I won the Acer Scholarship as the one and only candidate in my department, which is the ultimate accolade for distinguished students endowed by my university. Presently, I am preparing my graduation thesis and trying for the honor of Excellent Graduation Thesis.
Research experience and academic activity
When a sophomore, I joined the Association of AI Enthusiast and began to narrow down my interest for my future research. In 1997, I participated in simulation tool development for the scheduling system in Prof. Wang’s lab. With the tool of OpenGL and Matlab, I designed a simulation program for transportation scheduling system. It is now widely used by different research groups in NUST. In 1998, I assumed and fulfilled a sewage analysis & dispose project for Nanjing sewage treatment plant. This was my first practice to convert a laboratory idea to a commercial product.
In 1999, I joined the distinguished Professor Yu-Geng Xi's research group aiming at Network flow problem solving and Heuristic algorithm research. Soon I was engaged in the FuDan Gene Database Design. My duty was to pick up the useful information among different kinds of gene matching format. Through the comparison and analysis for many heuristic algorithms, I introduced an improved evolutionary algorithm -- Multi-population Genetic Algorithm. By dividing a whole population into several sub-populations, this improved algorithm can effectively prevent GA from local convergence and promote various evolutionary orientations. It proved more efficiently than SGA in experiments, too. In the second semester, I joined the workshop-scheduling research in Shanghai Heavy Duty Tyre plant. The scheduling was designed for the rubber-making process that covered not only discrete but also continuous circumstances. To make a balance point between optimization quality and time cost, I proposed a Dynamic Layered Scheduling method based on hybrid Petri Nets. The practical application showed that the average makespan was shortened by a large scale. I also publicized two papers in core journals with this idea. Recently, I am doing research in the Composite Predict of the Electrical Power system assisted with the technology of Data Mining for Bao Steel. I try to combine the Decision Tree with Receding Optimization to provide a new solution for the Composite Predictive Problem. This project is now under construction.
Besides, In July 2000, I got the opportunity to give a lecture in English in Asia Control Conference (ASCC) which is one of the top-level conferences among the world in the area of control and automation. In my senior year, I met Prof. Xiao-Song Lin, a visiting professor of mathematics from University of California-Riverside, I learned graph theory from him for my network research. These experiences all rapidly expanded my knowledge of English and the understanding of western culture.
I hope to study in depth
In retrospect, I find myself standing on a solid basis in both theory and experience, which has prepared me for the Ph.D. program. My future research interests include: Network Scheduling Problem, Heuristic Algorithm research (especially in GA and Neural network), Supply chain network research, Hybrid system performance analysis with Petri nets and Data Mining.
Please give my application materials a serious consideration.  Thank you very much.

 

 

 面试范文

Introducing Yourself at an Interview (应征面谈)

    Good monring. It\'s a pleasure for me to be here in front of you to present myself. My name is Philip Wong, and I am a candidate for the position of Overseas Sales Representative.

    My background and work experience are tailor-made for this position. I studied marketing as an undergrad here in Taiwan, and in 1985, I received my MBA from the University of Texas School of Business. For five years now, I have utilized my skills and knowledge as the Assistant Director of Exports for magic kitchen Supplies.

    Action Appliances is a forward-looking company. I am aware that you are expanding into new markets, particularly in the U.S. Thus you are going to need aggressive, take-charge sales representatives. At magic Kitchen, during my five years there, we expanded our U.S market share by 25%. This is just one example of my ability to go out there and sell products.

    A position with your company would be both a learning experience and a great opportunity. I look forward to becoming part of the Action team. Thank you.

Philip在应征面试时,是这样介绍自己的:

    早安,很高兴能在这儿跟各位介绍自己;我是Philip Wong,来此应征海外业务代表。

    我的背景和工作经验使我足以胜任这份业务代表的工作,我在台湾念大学,主修行销,1985年,再从美国德州大学的商学院得到工商管理硕士的学位。过去五年来,我以这些专业知识及技巧担任神奇厨具用品公司的外销部副主任。

    Action电器公司是个高瞻远瞩的公司,我知道你们正在开拓市场,尤其要在美国闯下一片天地;正因为如此,你们需要一位积极,肯负责的业务代表。在神奇厨具用品公司,我们将产品在美国的市场占有率提高了25%,这正足以证明我有能力在当地推销产品。

    如果能够进入贵公司工作,对我来说将是个大好机会,又可以好好继续学习。我希望能成为Action电器公司的一员,谢谢。

 

个人简历中如何用英语自我赞美

Mature,dynamic and honest.思想成熟、精明能干、为人诚实。
   Excellent ability of systematical management.有极强的系统管理能力。
  Ability to work independent1y,mature and resourcefu1.能够独立工作、思想成熟、应变能力强。
  A person with ability plus flexibility should app1y.需要有能力及适应力强的人。
  A stable personality and high sense of responsibility are desirable.个性稳重、具高度责任感。
  Work well with a multi-cultural and diverse work force.能够在不同文化和工作人员的背景下出色地工作。
  Bright,aggressive applicants.反应快、有进取心的应聘者。
  Ambitious attitude essential.有雄心壮志。
  Initiative,independent and good communication skill.积极主动、独立工作能力强,并有良好的交际技能。
  Willing to work under pressure with leardership quality.愿意在压力下工作,并具领导素质。
  Willing to assume responsibilities.应聘者须勇于挑重担。
  Mature,self-motivated and strong interpersonal skills.思想成熟、上进心强,并具极丰富的人际关系技巧。
  Energetic,fashion-minded person.精力旺盛、思想新潮。
  With a pleasant mature attitude.开朗成熟。
  Strong determination to succeed.有获得成功的坚定决心。
  Strong leadership skills.有极强的领导艺术。
  Ability to work well with others.能够同他人一道很好地工作。
  Highly-motivated and reliable person with excellent health and pleasant personality.上进心强又可靠者,并且身体健康、性格开朗。
  The ability to initiate and operate independently.有创业能力,并能独立地从业。
  Strong leadership skill while possessing a great team spirit.有很高的领导艺术和很强的集体精神。
  Be highly organized and effecient.工作很有条理,办事效率高。
  Willing to learn and progress.肯学习进取。
  Good presentation skills.有良好的表达能力。
  Positive active mind essential.有积极、灵活的头脑。
  Ability to deal with personnel at all levels effectively。善于同各种人员打交道。
  Have positive work attitude and be willing and able to work diligently without supervision。有积极的工作态度,愿意和能够在没有监督的情况下勤奋地工作。
  Young,bright,energetic with strong career-ambition.年轻、聪明、精力充沛,并有很强的事业心。
  Good people management and communication skills. Team player.有良好的人员管理和交际能力。能在集体中发挥带头作用。
  Able to work under high pressure and time limitation.能够在高压力下和时间限制下进行工作。
  Be elegant and with nice personality.举止优雅、个人性格好。
  With good managerial skills and organizational capabilities.有良好的管理艺术和组织能力。
  The main qualities required are preparedness to work hard, ability to learn, ambition and good health.主要必备素质是吃苦耐劳精神好、学习能力优、事业心强和身体棒。
  Having good and extensive social connections.具有良好而广泛的社会关系。
  Being active, creative and innonative is a plus.思想活跃、有首创和革新精神尤佳。   
  With good analytical capability.有较强的分析能力。

posted @ 2006-03-09 10:32 逍遥草 阅读(4619) | 评论 (0)编辑 收藏
 Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流....本文的目的是为大家做一个简要的介绍。

  流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图:

  Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的:



  在这其中InputStream和OutputStream在早期的Java版本中就已经存在了,它们是基于字节流的,而基于字符流的Reader和Writer是后来加入作为补充的。以上的层次图是Java类库中的一个基本的层次体系。

  在这四个抽象类中,InputStream和Reader定义了完全相同的接口:

int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)

  而OutputStream和Writer也是如此:

int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)

  这六个方法都是最基本的,read()和write()通过方法的重载来读写一个字节,或者一个字节数组。

  更多灵活多变的功能是由它们的子类来扩充完成的。知道了Java输入输出的基本层次结构以后,本文在这里想给大家一些以后可以反复应用例子,对于所有子类的细节及其功能并不详细讨论。

import java.io.*;

    public class IOStreamDemo {

          public void samples() throws IOException {

               //1. 这是从键盘读入一行数据,返回的是一个字符串
               BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
               System.out.print("Enter a line:");
               System.out.println(stdin.readLine());

               //2. 这是从文件中逐行读入数据

               BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
               String s, s2 = new String();
               while((s = in.readLine())!= null
                          s2 += s + "\n"
               in.close();

               //3. 这是从一个字符串中逐个读入字节
               StringReader in1 = new StringReader(s2);
               int c;
               while((c = in1.read()) != -1)
                          System.out.print((char)c);

               //4. 这是将一个字符串写入文件
               try {
                          BufferedReader in2 = new BufferedReader(new StringReader(s2));
                          PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
                          int lineCount = 1;
                          while((s = in2.readLine()) != null
                                     out1.println(lineCount++ + ": " + s);
                          out1.close();
               } catch(EOFException e) {
                          System.err.println("End of stream");
               }
          }

    }

  对于上面的例子,需要说明的有以下几点:

  1. BufferedReaderReader的一个子类,它具有缓冲的作用,避免了频繁的从物理设备中读取信息。它有以下两个构造函数:

BufferedReaderReader in)
BufferedReaderReader in, int sz)

  这里的sz是指定缓冲区的大小。

  它的基本方法:

void close(//关闭流

           void mark(int readAheadLimit) //标记当前位置

           boolean markSupported() //是否支持标记

           int read() //继承自Reader的基本方法

           int read(char[] cbuf, int off, int len) //继承自Reader的基本方法

           String readLine() //读取一行内容并以字符串形式返回

           boolean ready() //判断流是否已经做好读入的准备

           void reset() //重设到最近的一个标记

           long skip(long n) //跳过指定个数的字符读取

  2. InputStreamReaderInputStreamReader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给             BufferedReader使用。

  3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

  这句话体现了Java输入输出系统的一个特点,为了达到某个目的,需要包装好几层。首先,输出目的地是文件IODemo.out,所以最内层包装的是FileWriter,建立一个输出文件流,接下来,我们希望这个流是缓冲的,所以用BufferedWriter来包装它以达到目的,最后,我们需要格式化输出结果,于是将PrintWriter包在最外层。

  Java提供了这样一个功能,将标准的输入输出流转向,也就是说,我们可以将某个其他的流设为标准输入或输出流,看下面这个例子:

import java.io.*;

public class Redirecting {

       public static void
main(String[] args) throws IOException {
              PrintStream console = System.out;
              BufferedInputStream in = new BufferedInputStreamnew FileInputStream"Redirecting.java"));
              PrintStream out = new PrintStream( new BufferedOutputStream new FileOutputStream"test.out")));
              System.setIn(in);
              System.setOut(out);

              BufferedReader br = new BufferedReadernew InputStreamReader(System.in));
              String s;
              while((s = br.readLine()) != null
                     System.out.println(s);
              out.close();
              System.setOut(console);
      }
}

  在这里java.lang.System的静态方法

static void setIn(InputStream in)
static void setOut(PrintStream out)

  提供了重新定义标准输入输出流的方法,这样做是很方便的,比如一个程序的结果有很多,有时候甚至要翻页显示,这样不便于观看结果,这是你就可以将标准输出流定义为一个文件流,程序运行完之后打开相应的文件观看结果,就直观了许多。

  Java流有着另一个重要的用途,那就是利用对象流对对象进行序列化。下面将开始介绍这方面的问题。

  在一个程序运行的时候,其中的变量数据是保存在内存中的,一旦程序结束这些数据将不会被保存,一种解决的办法是将数据写入文件,而Java中提供了一种机制,它可以将程序中的对象写入文件,之后再从文件中把对象读出来重新建立。这就是所谓的对象序列化Java中引入它主要是为了RMI(Remote Method Invocation)和Java Bean所用,不过在平时应用中,它也是很有用的一种技术。

  所有需要实现对象序列化的对象必须首先实现Serializable接口。下面看一个例子:

import java.io.*;
import java.util.*;

public class Logon implements Serializable {

       private Date date = new Date();
       private String username;
       private transient String password;


       Logon(String name, String pwd) {
              username = name;
              password = pwd;
       }


       public String toString() {
              String pwd = (password == null) ? "(n/a)" : password;
              return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;
       }


       public static void
main(String[] args) throws IOException, ClassNotFoundException {
              Logon a = new Logon("Morgan", "morgan83");
              System.out.println( "logon a = " + a);
              ObjectOutputStream o = new ObjectOutputStreamnew FileOutputStream"Logon.out"));
              o.writeObject(a);
              o.close();

              int seconds = 5;
              long t = System.currentTimeMillis() + seconds * 1000;
              whileSystem.currentTimeMillis() < t) ;

              ObjectInputStream in = new ObjectInputStreamnew FileInputStream"Logon.out"));
              System.out.println( "Recovering object at " + new Date());
              a = (Logon)in.readObject();
              System.out.println("logon a = " + a);
       }
}

  类Logon是一个记录登录信息的类,包括用户名和密码。首先它实现了接口Serializable,这就标志着它可以被序列化。之后再main方法里ObjectOutputStream o = new ObjectOutputStreamnew FileOutputStream"Logon.out"));新建一个对象输出流包装一个文件流,表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。想要还原的时候也很简单ObjectInputStream in = new ObjectInputStreamnew FileInputStream"Logon.out"));新建一个对象输入流以文件流Logon.out为参数,之后调用readObject方法就可以了。

  需要说明一点,对象序列化有一个神奇之处就是,它建立了一张对象网,将当前要序列化的对象中所持有的引用指向的对象都包含起来一起写入到文件,更为奇妙的是,如果你一次序列化了好几个对象,它们中相同的内容将会被共享写入。这的确是一个非常好的机制。它可以用来实现深层拷贝。

  关键字transient在这里表示当前内容将不被序列化,比如例子中的密码,需要保密,所以没有被写入文件。

  对Java的输入输出功能,就浅浅的介绍到这里,本文的目的只是开一个好头,希望能让大家对Java输入输出流有个基本的认识。

posted @ 2006-03-09 10:28 逍遥草 阅读(265) | 评论 (0)编辑 收藏
Web Service 的故障处理会是一件很困难的事情,因为很多方面都会发生问题。这篇文章描述了你可能会遇到的各种问题,并说明应如何来处理它们。特别的,我们将讨论如下问题:

  • 回顾SOAP请求
  • 深入服务器端Visual Basic代码
  • 深入服务器端Visual C++代码
  • 跟踪SSL问题
  • 深入Favorites Service中的问题
回顾SOAP请求
当开发一个简单对象访问协议(SOAP)客户端应用程序或服务器终端时,有一大堆东西可能出错。例如,SOAP请求可能不符合Web Service 描述语言(WSDL)规范,或SOAPAction项是错的。为了调试这些问题,你需要一个工具来查看SOAP请求和消息交换。在Microsoft Windows平台上,你有两个很好的工具。如果你只是想要调试SOAP请求,你应该下载Microsoft SOAP Toolkit 2.0,得到SOAP跟踪工具(MsSoapT.exe)。当你想要查看整个HTTP信息,请去http://www.pocketsoap.com/下载tcpTrace。这两个工具是互补的。你应该怎样查看SOAP请求呢?
这两个工具都是通过截取并发送请求来查看SOAP请求的。要截取请求信息,你必须让你的客户端使用跟踪工具正在监听的端口。假定你在客户端用一个WSDL文件来建立调用,你必须将该文件装载到你的机器上,并编辑服务部分。在一台机器上,我们有一个Web Service ,它的服务部分如下:
<service name='ArticleDemo' >
<port name='ExampleSoapPort' binding='wsdlns:ExampleSoapBinding'>
<soap:address location='http://hopehubris/test/ArticleDemo.WSDL'/>
</port>
</service>

上面这个部分规定了ArticleDemo这个Web Service 的SOAP终端在http://hopehubris/test/ArticleDemo.WSDL默认的HTTP端口监听,即80端口。为了从该端口监听来往的消息,你必须编辑该文件以监听本机上另一个端口。要监听8080端口,你应将文件做如下修改并保存:
<service name='ArticleDemo' >
<port name='ExampleSoapPort' binding='wsdlns:ExampleSoapBinding'>
<soap:address
location='http://localhost:8080/test/ArticleDemo.WSDL'/>
</port>
</service>

经过以上改动,启动MsSoapT.exe或者tcpTrace.exe并告知它监听8080端口,然后将请求发向hopehubris的80端口(见图一和图二)

点击小图放大

图一 配置MSSoapT.exe

点击小图放大

图二 配置tcpTrace.exe
通过以上方法,你可以查看进出的请求了。当所有的通讯正常工作,你只需要调试SOAP消息时,MSSoapT.exe是一个很好的工具。图三中显示了正常的消息交换。

点击小图放大

图三 MSSoapT.exe中正常的交换
现在,我们来讨论怎样使用这些工具来调试问题。你可能经常遇到的问题是一个终端可能消失或者迁移了。利用一些良好的错误处理机制,你可以会发现问题,但是怎样确定是什么来往消息能够确认问题是由不存在的Web Service 造成的呢?对于这个问题,tcpTrace.exe能很好的解决。图四中显示了这种情况--你从服务器处得到响应,表示它对于你请求的终端不能处理。

点击小图放大

图四 使用tcpTrace.exe查看HTTP请求
当你开发SOAP客户端应用程序时,你可能发现产生了很多SOAP错误。可能的原因包含从传送坏数据到服务器端问题。有时候直接查看XML文件比将错误信息提取出来写进日志文件更容易。对于你产生的每一个错误,你会想办法让客户端去处理。但为了发现错误,使用跟踪工具是很有帮助的。查看原始XML文件,请使用MSSoapT.exe。为了显示它是怎样工作的,我们以一个SOAP调用为例,它将两个数字相加,并当地一个参数小于10时,强行返回一个SOAP错误。以下是5和20相加的SOAP请求:
<?xml version="1.0" encoding="UTF-8"standalone="no" ?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAPSDK1:AddNumbers
xmlns:SOAPSDK1="http://tempuri.org/message/">
<arg1>5</arg1>
<arg2>20</arg2>
</SOAPSDK1:AddNumbers>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如果一切正常而且终端没有被破坏,我们希望返回25。但是,终端被破坏了,得到以下结果:
<?xml version="1.0" encoding="UTF-8"standalone="no" ?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>AddNumbers</faultstring>
<faultactor>
http://tempuri.org/action/Example.AddNumbers
</faultactor>
<detail>
<mserror:errorInfo
xmlns:mserror=
"http://schemas.microsoft.com/soap-toolkit/faultdetail/error/">
<mserror:returnCode>-2146828188</mserror:returnCode>
<mserror:serverErrorInfo>
<mserror:description>
The first number must be greater than 10
</mserror:description>
<mserror:source>AddNumbers</mserror:source>
</mserror:serverErrorInfo>
<mserror:callStack>
<mserror:callElement>
<mserror:component>Client</mserror:component>
<mserror:description>
The first number must be greater than 10
</mserror:description>
<mserror:returnCode>
-2147352567
</mserror:returnCode>
</mserror:callElement>
<mserror:callElement>
<mserror:component>
WSDLOperation
</mserror:component>
<mserror:description>
Executing method AddNumbers failed
</mserror:description>
<mserror:returnCode>
-2147352567
</mserror:returnCode>
</mserror:callElement>
</mserror:callStack>
</mserror:errorInfo>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

上面的错误提供了很多信息,可以帮助你发现问题的所在。从错误中可见,WSDLOperation组件发现AddNumbers方法失败。它还表明是客户端发生问题,而且问题是:第一个数必须大于10。图五中显示了MSSoapT.exe中这个错误是怎样的。

点击小图放大

图五 跟踪SOAP错误
这些工具还有很多用途。你可以用它们来分析SOAP请求和响应。有时候,Web Service只有一个客户端。如果你有客户端的源代码,你可以修改终端,让它可以通过跟踪工具。这样,你可以利用Microsoft SOAP Toolkit的底层API来反过来设计WSDL文件或构建客户端程序。

其他跟踪方法
MSSoapT.exe和tcpTrace.exe是查看SOAP请求甚至HTTP请求的优秀工具,但有的情况下,这些工具收效甚微。比如,如果你尝试发送SOAP请求给服务器,但是它的主机名不能解析,或者不能接受TCP连接,你就无法利用前面所述的两种跟踪工具了。另一种情况可能发生在你试图通过安全套接层(SSL)来进行SOAP通讯。MSSoapT.exe和tcpTrace.exe在SSL下是没有什么作用。所以,在这些情况下,可以使用以下方法:
  • Microsoft Network Monitor,它是监控网络数据包的一个管理工具。如果你安装了Windows 2000 Server中带的版本,你可以看到本机发送和接收的数据包。System Management Server中带的是完整版,它能够显示物理网络中所有的数据包。Network Monitor可以用来查看所有试图连接SOAP服务器的信息流。例如,当试图解析要连接的服务器主机名时,你可以看到DNS请求和响应。当与服务器建立连接时,你也可以看到TCP握手数据包。这可以告诉你TCP连接是否正常建立,还是服务器过早的重置了你的连接。你还可以看到数据包中的数据,这样就可以跟踪HTTP报文头和SOAP信封了,当然这在前面所述的两个工具中查看会更方便。Network Monitor不会显示发送到本机的数据流。而且,它虽然能够显示通过SSL连接的数据,但是那是加密的,所以查看其中的数据包内容是没有意义的。
  • 通过自定义的ISAPI ReadRawData and SendRawData Filter可以查看你的Web Service 器所有发送和接收的数据。这包括发向你的Web Service 的SOAP请求和响应。MSSoapT.exe 和tcpTrace.exe已经实现了通过ISAPI filter实现的许多功能,但有一个重要的例外:ISAPI filter可以查看SSL中传输的数据,因为它能工作在SSL加密/解密层之上。因此,如果你想要解决SSL中的问题,你可以看到其中HTTP和SOAP等数据。由于ISAPI filter处于较高的网络层次,你将看不到那些连接建立等Network Monitor提供的细节。想要知道如何编写ISAPI filter,请看开发ISAPI Filters一文。
深入服务器端Visual Basic代码
有时候,你需要调试你自己的代码以确定产生错误结果的原因。当调试Microsoft Visual Basic应用程序时,你必须按照KB:PRB:Error Occurs When You Debut a COM+ Component Under the Visual Basic IDE with an ASP Client中的步骤来处理。这篇文章只适用于Visual Basic集成开发环境下调试COM+组件。文章中第一条也适用于调试SOAP对象。为了节省你查看KB文章的时间,以下是其中一些相关内容的摘要:
1. 在DCOM中创建VB ASP Debugging项:
a. 打开写字板或其他文本编辑器,输入以下语句,这是大小写敏感的。
REGEDIT4
[HKEY_CLASSES_ROOT\CLSID\{70F214BA-94E2-4bdf-8F30-32CB4A905E4D}]
@="VB ASP Debugging"
[HKEY_CLASSES_ROOT\CLSID\{70F214BA-94E2-4bdf-8F30-32CB4A905E4D}\LocalServer32]
@="vb6.exe"
[HKEY_CLASSES_ROOT\AppID\vb6.exe]
"AppId"="{70F214BA-94E2-4bdf-8F30-32CB4A905E4D}"

b.将文件保存为Vbaspdbg.reg。
c.定位到保存该文件的文件夹,双击该文件(它会自动在Windows注册表中注册)。
2. 在DCOM配置中,将Everyone账号的许可加入Visual Basic ASP debugging中。
a.打开DCOMCNFG。在Start菜单中,按Run,在对话框中输入dcomcnfg。
b. 在Distributed COM Configuration Properties页面中,按Application标签,从列表中选择VB ASP Debugging,然后按Properties。
c. 在VB ASP Debugging Properties属性单中,按Securities标签,然后选中Use custom access permissions。按Edit。
d. 在Registry Value Permissions窗口中,按Add,然后加入Everyone账号,允许Allow Access。
e. 按OK,然后按Apply并退出Distributed COM Configuaration Properties页面。
注意,这样做会给你的系统带来一些安全漏洞。请不要在你实际生产或对外的机器上这样调试。
一旦完成以上步骤,当SOAP客户端调用COM对象时,你就可以调试它们了。如果重新build你的应用程序或设置断点时遇到问题,相关的COM对象可能已经在内存中了。要卸载这些对象,进入命令行,输入iisreset。它将使IIS和相关进程重启。在此过程中,DLL和COM对象就从内存中释放了。

深入服务器端的Visual C++代码
在服务器端调试Microsoft Visual C++?代码比VB要容易得多。Visual C++让你能够连接到正在运行的进程中,所以你只要连接到需要调试的DLL运行所在的进程,你就可以设置断点,单步调试等等。但也有一些要注意的地方,让我们来看一下其中一部分问题。
通常可以通过菜单操作,将Visual C++调试程序连接到运行的进程中去。在Visual C++编程环境中,选择Build,在选择Start Debug,然后再选Attach to Process。你可以看到Attach to Process对话框(见图一)并选择要调试的进程。一旦你连接上了,就可以打开源文件并设置断点,假如你的EXE或DLL的调试版本是在该进程中运行的,而且有debug symbol。

问题一:在对话框中没有进程列出!这是Microsoft Visual Studio? 6.0 SP3或更早版本中的bug,请使用SP4或更高版本。另一个方法是,请确定Visual C++是你的默认调试器,然后在任务管理器中点击右键,选中想要调试的进程并从弹出菜单中选择Debug。

问题二:对话框只显示了桌面上运行的程序!请确认你选中了Show System Processes。

问题三:我应该连接到什么进程?如果你有一个组件在IIS中使用(就像SOAP Toolkit 2.0中DLL组件),它们默认运行在dllhost.exe进程中。不幸的是,也许会有很多这样的进程,你就不知道你的DLL到底运行在哪一个之中了。如果你刚刚启动了一个dllhost.exe实例,想要调试,它会在Visual C++的Attach to Process对话框中列在最上面。如果你的应用程序已经运行了一段时间了,通常你可以通过任务管理器中Processest标签下查看你一个DLLHOST版本占用了大量内存和CPU,以次猜测出是该进程。但是,如果你想要精确的知道你的DLL运行在哪一个进程中,你可以使用tlist.exe这个工具,通过安装在Windows 2000的光盘中\Support\Tools目录中的支持工具就可以得到它。然后,你在命令行中可以输入:
TLIST -m mydll.dll

来得到加载了你的DLL的进程列表。你可以辨识出相应的dllhost.exe实例,然后连接上去。如果你的Web Service 运行所在的虚拟目录的应用程序安全性设置为低,它会在IIS的主进程inetinfo.exe中运行,而不是dllhost.exe。
我们开发Favorites Service时遇到的一个重要问题就是调试SSFKeyCache服务,它不在IIS进程或者DLLHOST进程之中。我们用ATL将SSFKeyCache创建为系统服务。当你在调试模式下编译COM server系统服务工程时,它被注册为普通进程外COM server。如果问题只发生在第一次调用COM server的时候就没有什么问题,但是如果像我们在SSFKeyCache中那样要保留调用中的信息,你必须将它驻留在内存之中。因此,为了调试它,我们将SSFKeyCache编译为调试版本,然后将其重新注册为普通系统服务。在命令行中运行:
SSFKeyCache -Service

然后,我们手工启动这个服务。请在命令行运行:
NET START SSFKEYCACHE

这样我们才能用Visual C++连接到运行的进程中,设置断点等等。如果不必要捕捉到SSFKeyCache组件第一个实例的创建,我们可以等待其他的调用,服务会自行启动的。

深入SSL问题
当通过安全套接层连接到Web Service 时,你会遇到很多问题。要诊断这些错误有时候是很困难的,特别是如果你只是从SOAP工具中收到一些普通的TCP连接错误。通常发生的有四个问题,其中的三个可以通过在IE浏览器中连接WSDL文件中指定的地址来发现。
SSL服务器证书没有安装。想要在你服务器上支持SSL,你首先要安装服务器证书。如果你没有安装,你不能连接到服务器上HTTP默认的SSL连接端口443。SOAP Toolkit 2.0会返回一个0x800A1518 (-2146822888)错误,表示连接错误。这也是其他三个SSL相关错误的错误代码。如果你在IE中试图浏览HTTPS开头的URL,你会得到一个标准的DNS出错页面。去掉"S"后再试一遍。如果你得到不同的出错信息,你就知道是服务器证书还没有安装。
URL中的主机名同服务器证书中的名字不匹配。当你为Web Service 器创建服务器证书时,你必须确定其中的名字同用户访问时URL中的主机名一致。如果不一致,当你用IE访问时,你会看到一个Security Alert对话框,如图六所示。当证书已经正确安装,但使用localhost指定本地计算机时,也常常看到这个问题。要避免这个问题,请将WSDL文件中location元素指定为你的服务器证书中所使用的名字。

点击小图放大

图六 IE Security Alert对话框,它表示证书同站点名称不一致

证书颁发机构不是受信任的机构。很多人都使用Microsoft Certificate Server来创建证书,安装到自己的机器上进行测试。这样可以比购买真正的得到全球广泛认证的服务器证书节约时间和费用。但是,当你成为自己的证书的认证机构时,网络中其他的机器并不信任你发布的证书。这些机器必须首先为你的认证机构安装根证书,然后才能通过安全套接层连到你的服务器。同样的,你可以通过在IE中用HTTPS URL指定Web Service,来确认是否有这个问题。如果证书颁发机构不是受信任的机构,你会看到和图6相似的对话框,除了左上角的图标会变成警告图示。你的认证机构的证书必须安装在想用SSL连接到你的服务器的所有计算机上。
该证书机构不在受信任的本机证书列表中。如果你在IE中连接到该Web Service ,没有看到Security Alert 对话框(即使重启IE也没有),但是你仍然无法通过ASP页面访问Web Service,这可能是一个更微妙的问题。当你安装证书认证机构的证书时,你可能将它加入到个人的证书认证列表中。而ASP页面是在IIS进程中的,不能访问你用户账号中的证书列表。为了使ASP页面能够通过SSL进行访问,请确定证书认证机构的证书是作为受信任的根证书安装在本机的证书列表之中。你可以打开mmc.exe,添加Certificates MMC插件并将证书认证机构的证书导入本机列表之中,成为受信任的根证书。这样问题就解决了。
关于Favorites Services中安装SSL功能的具体步骤,请查阅Installing the Favorites Service

深入Favorites Service 中的问题
如果你想使用Favorites Service并遇到了问题,你会怎么做呢?例如,你可能在登陆时会看到这样的消息:"Favorites现在不能使用。请您的网站管理员查看日志中的详细信息"。这时应该怎么处理呢?
首先,你应该按照消息中的指示去做。如果你在单机上进行了完整安装,那你就是网站管理员,所以你应该查看事件日志。Favorites Service(包括范例客户站点)在Application日志中记录事件,source是"Favorites Web Service"。出错消息如下所示:

点击小图放大

图七 Favorites Service日志范例
你可能注意到图七中描述框的内容还有待改进。我们现在没有提供更好的日志功能。由于日志功能是由VB写的DLL实现的,因此很难使用C++工具来定制日志中的格式化字符串。当日志查看器无法正确显示信息时,就将传递给日志的字符串显示出来。在这里就是"/ssf/logon.asp: Nonsecure Logon request attempted."。这表明有人试图通过非SSL的连接方式进行登陆,所以用户名和密码没有经过加密。而Favorites Service是不会接受非SSL传递的登陆请求的。
如果你怀疑你的日志中没有应该可以看到的日志记录,请你确认Application Event Log没有设置RestrictGuestAccess键。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application中查看RestrictGuestAccess设置。默认状态下该键值为0,表示guess access是允许的。但是如果你对系统的安全性做过调整,或你的域安全策略在这方面有限制,那么这个设置会被启动。由于Favorites Service是运行在匿名账号下的,只有guest权限,如果RestrictGuestAccess设为1,你在事件日志中就看不到Favorites Service的事件了。
有时候,你除了日志信息外还需要一些其他的信息。例如,你可能收到一个加入喜好的请求,但产生了一个SOAP错误,你想要得到关于这个请求的更多的信息。Favorites Service有一个审计日志记录了它所有的活动供你查看。审计信息是存放在SSF-Report数据库中的AuditLog表中的。你可以使用SQL Query Analyzer或在Microsoft SQL Server?的Enterprise Manager中选择Return all rows查看所有的信息。Actiontype字段可以通过ActionType表以更友好的名字表示。而description字段中会包含与请求相关的额外信息。
怎样才能跟踪与请求相关的IP地址呢?你可能想要设置一些限制,或查看请求来自何方。审计日志中只告诉你时间,但没有IP地址。在http://www.coldrooster.com/,我们用IIS 日志来记录HTTP相关信息。为了跟踪日志记录中的请求的IP地址,我们要查看审计日志中的时间戳,在IIS日志中寻找相应的信息。通常在同一时间段中,不会有太多的请求同时发生。请记住,IIS日志默认是按格林尼治标准时间来记录时间戳的,所以你在做相应的查找时,必须做一些相应的时区转换。
最后一个我们要讨论的问题与web farm有关,就像http://www.coldrooster.com中:我们的Web服务器上不仅有Favorites Service的虚拟目录,还有其他的虚拟目录,如SSFPublic,coldrooster.com目录等。这使问题变得复杂,因为如果要查找一个问题,它可能发生在三台机器中的任何一台。同样,当一个错误的请求发送过来,并不确定是哪一个服务器来处理的。请注意,在一台单机上是很容易查找问题的,当与内部Web请求可能相关,要到其他机器上去寻找问题时,就会有问题了。要同步所有机器上不同的事件是很困难的,但并不是不可实现的。

小结
在这篇文章中,我们提供了一些Web Service故障检测和处理的方法,并以Favorites Service为例进行说明。这可以帮助解决一些你实际中遇到的问题。
posted @ 2006-03-09 10:04 逍遥草 阅读(570) | 评论 (0)编辑 收藏
.NET平台内建了对Web service的支持,包括Web service的构建和使用。 与其它开发平台不同,使用.NET平台,你不需要其他的工具或者SDK就可以完成Web service的开发了。.NET Framework本身就全面支持Web service,包括服务器端的请求处理器和对客户端发送和接受SOAP消息的支持。本节将带你用.NET创建和使用一个简单的Web service。
要在.NET中创建Web service,你只需建立一个.asmx文件。这个文件中有一个WebService标签,包含Language和class两个属性,分别用于指定编程语言和Web service中暴露出的类。然后你就可以像平常一样编写你的类了。最后,在每个你想要暴露出的方法前面加一个System.Web.Services.WebMethodAttribute属性就可以了。最终代码类似于下面的程序清单。
'a WebService in VB.NET (calc_vb.asmx)
<%@WebService Language="VB"class="Calc" %>
Imports System.Web.Services
Public Class Calc
<WebMethod()> _
Public Function Add(ByVal a As Double, _
ByVal b As Double) As Double
Return a + b
End Function
End Class

用浏览器来浏览这个.asmx文件,你可以得到一张测试这个Web service的页面。例如,你把calc_vb.asmx 文件放到了Web服务器的myService目录下,那么相应的URL就是:
http://localhost/myService/calc_vb.asmx
测试页如下图所示。这一页是自动生成的。它显示了Web service 的名字并列出了可以调用的方法。列表后面有一段文字,意思是你正在使用缺省的命名空间http://tempuri.org/,如果你想要发布这个Web service的话,最好换一个你自己的命名空间,以避免名字上的冲突。本书后面的部分将会讨论Web service 命名空间的问题。在第六章中,我还会介绍怎样使用.NET的属性来指定命名空间和其他一些东西。

自动生成的Web service测试页,点击小图放大

在测试页里点击Add方法,你会得到一个HTML表单,用来测试这个方法(见下图)。在这个表单里,Add方法所接受的所有参数都有一个相应的文本框。填好所有的参数,点击"Invoke"按钮,这个表单就会被提交到Web服务器。实际上,这就是通过HTTP GET的形式在调用Web service。得到的结果是一个如下的简单XML文档:
<double xmlns="http://tempuri.org/">158</double>
浏览下面这个URL,可以直接调用Add方法:
http://localhost/myService/calc_vb.asmx/Add?a=123&b=35
如你所见,方法的名字是你所请求的资源(注意,这里是区分大小写的),而函数中的每个参数都映射为查询字符串中的一个参数。这种形式对快速测试一个Web service 是非常方便的。不过,因为这种方式使用的是HTTP GET,所以它在数据类型和参数传递方向等方面都有一些局限。我们将在第六章中详细讨论这些局限。

自动生成的Add方法测试页,点击小图放大

回到前面的Web service测试页,我们还可以看到页面的顶部有一个Service Description链接。点击过去你就可以得到描述这个Web service的WSDL文档,如下图。在Web service的URL后面加上一个"WSDL"查询字符串,你也可以直接浏览到这一页:
http://localhost/myService/calc_vb.asmx?wsdl

点击小图放大

Calc Web service的WSDL文档。注意,为了显示更多内容,所有的XML元素都已折叠起来。
Calc Web service的WSDL文档。注意,为了显示更多内容,所有的XML元素都已折叠起来。
要在.NET中调用一个Web service ,你需要先运行wsdl.exe工具。这个工具会从Web service中读出它的WSDL描述文档,生成一个可以调用这个Web service的代理类。例如,在命令行中执行下面的命令,可以生成Calc Web service的代理类:
wsdl.exe /language:VB http://localhost/myService/calc_vb.asmx?wsdl
程序清单1-2截取自生成的VB代理类源码。这个代理类继承自System.Web.Services.Protocols.SoapHttpClientProtocol类,并且暴露出一个Add方法,这个方法接收两个double型浮点数,返回一个double型浮点数。
程序清单1 2 截取自wsdl.exe 生成的Web service代理类源代码
Imports System.Web.Services.Protocols
'省略其他代码
Public Class Calc
Inherits SoapHttpClientProtocol
'省略其他代码
<System.Diagnostics.DebuggerStepThroughAttribute(),_
SoapDocumentMethodAttribute( _
"http://tempuri.org/Add", _
Use:=System.Web.Services.Description.SoapBindingUse.Literal,_
ParameterStyle:= SoapParameterStyle.Wrapped)>_
Public Function Add(ByVal a As Double, ByValb As Double) As Double
Dim results() As Object = Me.Invoke("Add",_
New Object() {a, b})
Return CType(results(0), Double)
End Function
'省略其他代码
End Class
此后的工作就非常简单了。要调用CalculatorWeb service,只需实例化一个Calc的代理对象,再调用它的Add方法:
Dim ws As New Calc()
Dim result As Double = ws.Add(20.5, 10.9)
MessageBox.Show("结果是:" &result.ToString)

实际上,代理类中的Add方法仅仅是通过.NET Framework的SoapHttpClientProtocol类来调用Web service,然后再把Web service 的返回值返回给调用者。
当然,除了上面的这些演示之外,.NET Web service的创建和调用还有很多的内容。不过,在深入这些细节之前,我们需要先理解Webservice里面的几个关键技术:XSD、SOAP和WSDL。
posted @ 2006-03-09 10:02 逍遥草 阅读(411) | 评论 (0)编辑 收藏
实际上,Web Service的主要目标是跨平台的可互操作性。为了达到这一目标,Web Service 完全基于XML(可扩展标记语言)、XSD(XML Schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。由此可以看出,在以下三种情况下,使用Web Service会带来极大的好处。

长项一: 跨防火墙的通信
如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。在这种情况下,使用DCOM就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。传统的做法是,选择用浏览器作为客户端,写下一大堆ASP页面,把应用程序的中间层暴露给最终用户。这样做的结果是开发难度大,程序很难维护。


图1 通过Web Service集成应用程序

举个例子,在应用程序里加入一个新页面,必须先建立好用户界面(Web页面),并在这个页面后面,包含相应商业逻辑的中间层组件,还要再建立至少一个ASP页面,用来接受用户输入的信息,调用中间层组件,把结果格式化为HTML形式,最后还要把“结果页”送回浏览器。要是客户端代码不再如此依赖于HTML表单,客户端的编程就简单多了。

如果中间层组件换成Web Service的话,就可以从用户界面直接调用中间层组件,从而省掉建立ASP页面的那一步。要调用Web Service,可以直接使用Microsoft SOAP Toolkit或.NET这样的SOAP客户端,也可以使用自己开发的SOAP客户端,然后把它和应用程序连接起来。不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。同时,应用程序也不再需要在每次调用中间层组件时,都跳转到相应的“结果页”。

从经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用Web Service这种结构,可以节省花在用户界面编程上20%的开发时间。另外,这样一个由Web Service组成的中间层,完全可以在应用程序集成或其它场合下重用。最后,通过Web Service把应用程序的逻辑和数据“暴露”出来,还可以让其它平台上的客户重用这些应用程序。

长项二: 应用程序集成
企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。应用程序经常需要从运行在IBM主机上的程序中获取数据;或者把数据发送到主机或UNIX应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常需要集成起来。通过Web Service,应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用。

例如,有一个订单登录程序,用于登录从客户来的新订单,包括客户信息、发货地址、数量、价格和付款方式等内容;还有一个订单执行程序,用于实际货物发送的管理。这两个程序来自不同软件厂商。一份新订单进来之后,订单登录程序需要通知订单执行程序发送货物。通过在订单执行程序上面增加一层Web Service,订单执行程序可以把“Add Order”函数“暴露”出来。这样,每当有新订单到来时,订单登录程序就可以调用这个函数来发送货物了。

长项三: B2B的集成
用Web Service集成应用程序,可以使公司内部的商务处理更加自动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。

Web Service是B2B集成成功的关键。通过Web Service,公司可以把关键的商务应用“暴露”给指定的供应商和客户。例如,把电子下单系统和电子发票系统“暴露”出来,客户就可以以电子的方式发送订单,供应商则可以以电子的方式发送原料采购发票。当然,这并不是一个新的概念, EDI(电子文档交换)早就是这样了。但是,Web Service的实现要比EDI简单得多,而且Web Service运行在Internet上,在世界任何地方都可轻易实现,其运行成本就相对较低。不过,Web Service并不像EDI那样,是文档交换或B2B集成的完整解决方案。Web Service只是B2B集成的一个关键部分,还需要许多其它的部分才能实现集成。

用Web Service来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为Web Service,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本,让许多原本无法承受EDI的中小企业也能实现B2B集成。

长项四: 软件和数据重用
软件重用是一个很大的主题,重用的形式很多,重用的程度有大有小。最基本的形式是源代码模块或者类一级的重用,另一种形式是二进制形式的组件重用。


图2 用Web Service集成各种应用中的功能,为用户提供一个统一的界面

当前,像表格控件或用户界面控件这样的可重用软件组件,在市场上都占有很大的份额。但这类软件的重用有一个很大的限制,就是重用仅限于代码,数据不能重用。原因在于,发布组件甚至源代码都比较容易,但要发布数据就没那么容易,除非是不会经常变化的静态数据。

Web Service在允许重用代码的同时,可以重用代码背后的数据。使用Web Service,再也不必像以前那样,要先从第三方购买、安装软件组件,再从应用程序中调用这些组件;只需要直接调用远端的Web Service就可以了。举个例子,要在应用程序中确认用户输入的地址,只需把这个地址直接发送给相应的Web Service,这个Web Service 就会帮你查阅街道地址、城市、省区和邮政编码等信息,确认这个地址是否在相应的邮政编码区域。Web Service 的提供商可以按时间或使用次数来对这项服务进行收费。这样的服务要通过组件重用来实现是不可能的,那样的话你必须下载并安装好包含街道地址、城市、省区和邮政编码等信息的数据库,而且这个数据库还是不能实时更新的。

另一种软件重用的情况是,把好几个应用程序的功能集成起来。例如,要建立一个局域网上的门户站点应用,让用户既可以查询联邦快递包裹,查看股市行情,又可以管理自己的日程安排,还可以在线购买电影票。现在Web上有很多应用程序供应商,都在其应用中实现了这些功能。一旦他们把这些功能都通过Web Service “暴露”出来,就可以非常容易地把所有这些功能都集成到你的门户站点中,为用户提供一个统一的、友好的界面。

将来,许多应用程序都会利用Web Service,把当前基于组件的应用程序结构扩展为组件/Web Service 的混合结构,可以在应用程序中使用第三方的Web Service 提供的功能,也可以把自己的应用程序功能通过Web Service 提供给别人。两种情况下,都可以重用代码和代码背后的数据。

从以上论述可以看出,Web Service 在通过Web进行互操作或远程调用的时候是最有用的。不过,也有一些情况,Web Service根本不能带来任何好处。

短处一: 单机应用程序
目前,企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下,最好就不要用Web Service,只要用本地的API就可以了。COM非常适合于在这种情况下工作,因为它既小又快。运行在同一台服务器上的服务器软件也是这样。最好直接用COM或其它本地的API来进行应用程序间的调用。当然Web Service 也能用在这些场合,但那样不仅消耗太大,而且不会带来任何好处。

短处二: 局域网的同构应用程序
在许多应用中,所有的程序都是用VB或VC开发的,都在Windows平台下使用COM,都运行在同一个局域网上。例如,有两个服务器应用程序需要相互通信,或者有一个Win32或WinForm的客户程序要连接局域网上另一个服务器的程序。在这些程序里,使用DCOM会比SOAP/HTTP有效得多。与此相类似,如果一个.NET程序要连接到局域网上的另一个.NET程序,应该使用.NET remoting。有趣的是,在.NET remoting中,也可以指定使用SOAP/HTTP来进行Web Service 调用。不过最好还是直接通过TCP进行RPC调用,那样会有效得多。

总之,只要从应用程序结构的角度看,有别的方法比Web Service 更有效、更可行,那就不要用Web Service。
posted @ 2006-03-09 10:00 逍遥草 阅读(367) | 评论 (0)编辑 收藏
典型的Web Service结构。

不管你的Web service是用什么工具,什么语言写出来的,只要你用SOAP协议通过HTTP来调用它,总体结构都应如下图所示。通常,你用你自己喜欢的语言(如VB 6或者VB.NET)来构建你的Web service,然后用SOAP Toolkit或者.NET的内建支持来把它暴露给Web客户。于是,任何语言,任何平台上的客户都可以阅读其WSDL文档,以调用这个Web service。客户根据WSDL描述文档,会生成一个SOAP请求消息。Web service都是放在Web服务器 (如IIS) 后面的,客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。对VB 6程序来说,Web service请求处理器是一个与SOAP Toolkit组件协同工作的ASP页面或ISAPI extension。而对VB.NET程序来说,Web service请求处理器则是一个.NET Framework自带的ISAPI extension。请求处理器的作用在于,解析收到的SOAP请求,调用Web service,然后再生成相应的SOAP应答。Web服务器得到SOAP应答后,会再通过HTTP应答的方式把它送回到客户端。

典型的Web service结构,点击小图放大


远程过程调用(RPC)与消息传递
Web service本身实际是在实现应用程序间的通信。我们现在有两种应用程序通信的方法:RPC(远程过程调用)和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC强调的是远程对象和它的界面,即属性、方法和调用时的参数。DCOM和.NET远程访问都是RPC的例子。
消息传递一般是在耦合度更低的系统中。消息传递的概念是,客户端向服务器发送消息,然后等待服务器的回应。消息传递系统强调的是消息的发送和回应,而不是远程对象的界面。由于是基于消息的系统,客户端和服务器之间的耦合度比RPC方法更低。
RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在使用本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。例如,你在VB 6中通过DCOM调用一个远程对象,你的代码看起来就与调用本地对象一样。而消息传递则不同,它强调传递的东西是什么,但不管消息传递过去后干什么。客户不需要知道服务器是怎么实现的,以及消息是怎么被处理的。
我们已经说过,你可以建立一个消息服务器,根据收到的消息来调用对象。这是通过消息传递方式有效的实现了RPC。如果客户仍然以消息的思维方式来进行操作,那么你可以把它叫做消息传递。但如果客户以远程对象的思维方式来进行操作,那么你就应该把它叫做RPC。
如果你想实现一个基于XML的消息传递系统,大量的工作将集中在处理XML请求和应答消息上。虽然VB 6和VB.NET中,帮助你建立Web Service的工具已经做了许多对XML消息进行处理的工作,但毕竟所有的数据都是用XML的形式收发的,许多情况下你还是需要对消息进行一些自己的处理。深入理解XML和XML Schema对于有效地实现XML消息系统是至关重要的。


建立Web Service
我知道你现在已经很心急的想要写点代码,看看Web service到底是什么样的了。那么我们现在就介绍怎样用VB 6和VB.NET实际做出一个Web service来。本节的目的只是向你展示一下这些工具的功能,而不是深入地讲解Web service的工作原理。本书后面的章节会向你慢慢说明Web service以及Microsoft SOAP Toolkit和.NET等工具的内部原理的。

使用SOAP Toolkit
Microsoft的SOAP Toolkit V2帮助你把COM组件变成Web service。这套工具分为三大主要部分:SoapClient是一个用于调用Web service的COM组件;SoapServer 是一个处理SOAP请求和返回SOAP应答的组件;还有一个WSDL向导,它可以把你的type library转换成WSDL文档,以暴露给Web service的客户。
假设你有一个COM组件,暴露出一个GetTemperature方法:
Public Function GetTemperature(ByVal zipcode As String, _
ByVal celsius As Boolean) As Single

要把这个组件变成一个Web service,你可以使用WSDL向导。给出你要转换的组件后,向导会要你选择你想暴露出的方法,指出生成的Web service所在的URL(如http://localhost/Temperature/),以及你希望用ASP还是ISAPI做你的请求处理器(如图1-2)。然后向导还会问你生成的WSDL和ASP文件应该放在那个目录下。

使用SOAP Toolkit向导来转换COM组件,点击小图放大


现在该调用这个Web service了。方法是在VB或其他任何可以使用COM的语言里调用SoapClient组件。下面这段代码演示了怎样调用Webservice中的GetTemperature方法:
Dim soap As MSSOAPLib.SoapClient
Set soap = New MSSOAPLib.SoapClient
soap.mssoapinit _
"http://localhost/Temperature/Temperature.wsdl"
MsgBox ("气温是: " & _
soap.GetTemperature("20171", False))

首先调用mssoapinit,把WSDL文档的URL传给SoapClient。WSDL文档的URL就是你在WSDL向导中给出的URL加上〈Service名字.wsdl〉。一旦初始化完成,SoapClient就得到了Web service的所有方法,你就可以直接调用这些方法了。
posted @ 2006-03-09 09:59 逍遥草 阅读(461) | 评论 (0)编辑 收藏
现在我将列举三种情况,在这三种情况下,你将会发现使用Web service会带来极大的好处。此后,我还会举出不应该使用Web service的一些情况。

跨越防火墙的通信
如果你的应用程序有成千上万的用户,而且他们都分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。那是因为客户端和服务器之间通常都会有防火墙或者代理服务器。在这种情况下,你想使用DCOM就不是那么简单了,而且,通常你也不愿意把你的客户端程序发布到如此庞大数量的每一个用户手中。于是,你最终选择了用浏览器作为客户端,写下一堆ASP页面,把应用程序的中间层暴露给最终用户。结果呢?运气好的话,只是开发难度大了一些,运气不好的话,就会得到一个根本无法维护的应用程序。
想象一下你应该怎么在你的应用程序里面加入一个新的页面:你必须先建立好用户界面(Web页面),以及在这个页面后面,包含相应商业逻辑的中间层组件。这还不够,你还要再建立至少一个ASP页面,用来接受用户输入的信息,调用中间层组件,把结果格式化为HTML形式,最后还要把"结果页"送回浏览器。要是客户端代码不再如此依赖于HTML表单,客户端的编程不就简单多了吗?还有,建立ASP页面的那一步可以省略掉吗?
当然。如果你的中间层组件是Web service的话,你完全可以从用户界面直接调用中间层组件,从而省掉建立ASP页面的那一步。要调用Web service,你可以直接使用Microsoft SOAP Toolkit或.NET这样的SOAP客户端,也可以使用你自己开发的SOAP客户端,然后把它和你的应用程序连接起来。这样做,不仅可以缩短开发周期,还可以减少代码的复杂度,并增强整个应用程序的可维护性。同时,你的应用程序也不再需要在每次调用中间层组件时,都跳转到相应的"结果页"了。
以我的经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用Web service这种结构,可以轻松的节省花在用户界面编程上的20%的开发时间。这样做还有另一个好处,就是你将得到一个由Web service组成的中间层,这一层是完全可以在应用程序集成或其他场合下被重用的。最后,通过Web service把你的应用程序的逻辑和数据暴露出来,还可以让其它平台上的客户重用你的应用程序。

应用程序集成
企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发的力量。你的应用程序经常都需要从运行在古老的IBM主机上的程序中获取数据;或者再把数据发送到主机或UNIX应用程序中去。即使是在同一个平台上,不同的软件厂商生产的各种软件也常常需要集成起来。通过Web service,应用程序可以用标准的方法把功能和数据暴露出来,供其它的应用程序使用。
例如,你有一个订单登录程序,用于登录从客户来的新订单,包括客户信息、发货地址、数量、价格和付款方式等信息。同时,你还有一个订单执行程序,用于实际货物发送的管理。这两个程序是来自不同软件厂商的。一份新订单进来之后,订单登录程序需要通知订单执行程序发送货物。通过在订单执行程序上面增加一层Web service,订单执行程序可以把"AddOrder"函数暴露出来。这样,每当有新订单到来时,订单登录程序就可以调用这个函数来发送货物了。如下图。

通过Web service集成应用程序,点击小图放大

B2B的集成
用Web service集成应用程序,可以使你公司内部的商务处理更加自动化。但当交易跨越了你的供应商和客户,突破了公司的界线时又会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。
Web service是B2B集成成功的关键。通过Web service,你的公司可以把关键的商务应用暴露给指定的供应商和客户。例如,把你的电子下单系统和电子发票系统暴露出来,你的客户就可以以电子的方式向你发送购货订单,而你的供应商则可以以电子的方式把原料采购的发票发送给你。当然,这并不是一个新的概念:电子文档交换(EDI)早就是这样了。Web service和EDI之间的主要区别在于,Web service的实现要比EDI简单得多,而且Web service是运行在Internet上的,在世界任何地方都可轻易实现,这样其运行成本就相对较低。不过,Web service并不像EDI那样,是文档交换或B2B集成的一套完整的解决方案。Web service只是B2B集成的一个关键部分,还需要许多其它的部分才能完成这个集成。
用Web service来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把你的商务逻辑暴露出来,成为Web service,你就可以让任何指定的合作伙伴轻松的调用你的商务逻辑,而不管他们的系统在什么平台上运行,使用的是什么开发语言。这样就大大减少了花在B2B集成的上的时间和成本。这样的低成本让许多原本无法承受EDI的投资成本的中小企业也能实现B2B集成。

软件重用
软件重用是一个很大的主题,它有很多的形式和程度。最基本的形式是源代码模块或者类一级的重用。另一种形式是二进制形式的组件重用。当前,像表格控件或用户界面控件这样的可重用软件组件在市场上都占有很大的份额。但这类软件的重用都有一个很严重的限制:重用仅限于代码,而数据不能被重用。原因在于你可以很轻易的发布组件甚至源代码,但要发布数据就没那么容易了,除非那些数据都是不会经常变化的静态数据。
而Web service允许你在重用代码的同时,重用代码后面的数据。使用Web service,你不再像以前那样,要先从第三方购买、安装软件组件,再从你的应用程序中调用这些组件。你只需要直接调用远端的Web service就可以了。举个例子,你想在你的应用程序中确认用户输入的邮件地址,那么,你只需把这个地址直接发送给相应的Web service,这个Web service 就会帮你查阅街道地址、城市、省区和邮政编码等信息,确认这个地址的确在相应的邮政编码区域。Web service 的提供商可以按时间或使用次数来对这项服务进行收费。这样的服务要通过组件重用来实现是不现实的,因为那样的话你必须下载并安装好包含街道地址、城市、省区和邮政编码等信息的数据库,而且这个数据库还是不能实时更新的。
另一种软件重用的情况是把好几个应用程序的功能集成起来。例如,你想要建立一个局域网上的门户站点应用,让用户既可以查询他们的联邦快递包裹,察看股市行情,又可以管理他们的日程安排,还可以在线购买电影票。现在Web上有很多应用程序供应商,都在其应用中实现了上面的这些功能。一旦他们把这些功能都通过Web service 暴露出来,你就可以非常轻易地把所有这些功能都集成到你的门户站点中,为用户提供一个统一的、友好的界面。如下图。

点击小图放大

用Web service来集成各种应用中的功能,为用户提供一个统一的界面
许多应用程序都会利用Web service,把当前基于组件的应用程序结构扩展为组件和Web service 的混合结构。你也可以在应用程序中使用第三方的Web service 提供的功能。你还可以把你自己的应用程序的功能通过Web service 提供给别人。所有这些情况下,你都可以重用代码和代码后面的数据。总之,Web service 将是软件重用的一种非常有力的形式。

什么时候不应该使用Web Service
一个对Web service的完整介绍还应该包括什么时候不该用Web service。经过前面的介绍,我们知道了Web service 在通过Web进行互操作或远程调用的时候是最有用的。不过,还有许多情况,Web service根本不能给你带来任何好处。

单机应用程序
目前,我们还有很多桌面应用程序是供商用和个人使用的。其中一些只需要与运行在本机上的其他程序通信。在这种情况下,我们最好就不要再用Web service ,只要用本地的API就可以了。COM非常适合于在这种情况下工作,因为它既小又快。运行在一台服务器上的服务器软件也是这样:最好直接用COM或其他本地的API来进行应用程序间的调用。当然Web service 也能用在这些情况下,但那样不仅消耗太大,而且不会给你带来任何好处。

局域网上的同构应用程序
在许多应用中,你所有的程序都是用VB或VC开发的,都在Windows平台下使用COM,都运行在同一个局域网上。例如,你有两个服务器应用程序需要相互通信,或者你有一个Win32或WinForm的客户程序要连接到局域网上的另一个服务器程序。在这些程序里使用DCOM会比SOAP/HTTP有效的多。类似的,如果你的一个.NET程序要连接到LAN上的另一个.NET程序,那么你应该使用.NET remoting。有趣的是,在.NET remoting中,你也可以指定使用SOAP/HTTP来进行Web service 调用。不过最好还是直接通过TCP进行RPC调用,那样会有效得多。总之,只要你从应用程序结构的角度看来,有别的方法比Web service 更有效,更可行,那就不要再用Web service。

总结
Web service是创建可互操作的分布式应用程序的新平台。Web service 的主要目标是跨平台的可互操作性。为了达到这一目标,Web service 是完全基于XML、XSD等独立于平台、独立于软件供应商的标准的。
Web service在应用程序跨平台和跨网络进行通信的时候是非常有用的。Web service适用于应用程序集成、B2B集成、代码和数据重用,以及通过Web进行客户端和服务器的通信的场合。
当然,Web service也不是万能的,你不能到处滥用Web service。在有些情况下,Web service 会降低应用程序的性能,而不会带来任何好处。例如,一台机器或一个局域网里面运行的同构应用程序就不应该用Web service 进行通信。
posted @ 2006-03-09 09:58 逍遥草 阅读(417) | 评论 (0)编辑 收藏
你可能早就听说过Web service了,你也可能已经对Web service有一些概念了。一时间,好像所有的计算机期刊、书籍和网站都开始提及Web service。然而,当前大多数对Web service的介绍都没能清楚的说明Web service到底是什么。他们只是鼓吹Web service是多么多么的好,简直就像是在做广告。在本文中会讲清楚两件事:Web service到底是什么;在什么情况下你应该使用Web service。

分布式应用程序和浏览器
研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户和服务器之间通信的问题。
传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作,同时也是许多IT工程师的噩梦。事实上,许多IT工程师宁愿忍受浏览器所带来的功能限制,也不愿在局域网上去运行一个DCOM。在我看来,结果就是一个发布容易,但开发难度大而且用户界面极其受限的应用程序。极端的说,就是你花了更多的资金和时间,却开发出从用户看来功能更弱的应用程序。不信?问问你的会计师对新的基于浏览器的会计软件有什么想法:绝大多数商用程序用户希望使用更加友好的Windows用户界面。
关于客户端与服务器的通信问题,一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用HTTP协议。同时,当前许多防火墙也配置为只允许HTTP连接。
许多商用程序还面临另一个问题,那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的,并且都运行在Windows平台上,那就天下太平了。然而,事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序访问。而且,目前还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样的语言编写。现在,除了最简单的程序之外,所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法,如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的"高级程序到程序交流(APPC)"等来完成的。在以前,没有一个应用程序通信标准,是独立于平台、组建模型和编程语言的。只有通过Web Service,客户端和服务器才能够自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么。

什么是Web Service
对这个问题,我们至少有两种答案。从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可已建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP GET请求:
http://host.company.com/weather.asp?zipcode=20171

返回的数据就应该是这样:
21,晴

这个ASP页面就应该可以算作是Web service 了。因为它基于HTTP GET请求,暴露出了一个可以通过Web调用的API。当然,Web service 还有更多的东西。
下面是对Web service 更精确的解释: Web services是建立可互操作的分布式应用程序的新平台。作为一个Windows程序员,你可能已经用COM或DCOM建立过基于组件的分布式应用程序。COM是一个非常好的组件技术,但是我们也很容易举出COM并不能满足要求的情况。
Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。

新平台
Web service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web service平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。在传统的分布式系统中,基于界面(interface)的平台提供了一些方法来描述界面、方法和参数(译注:如COM和COBAR中的IDL语言)。同样的,Web service平台也必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用。这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。下面几个小节就简要介绍了组成Web service平台的这三个技术。

XML和XSD
可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,还是64位?这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web service平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合Web service标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。在第二章中,我们将深入XSD,学习怎样转换自定义的数据类型(例如类)到XSD的类型。

SOAP
Web service建好以后,你或者其他人就会去调用它。简单对象访问协议(SOAP)提供了标准的RPC方法来调用Web service。实际上,SOAP在这里有点用词不当:它意味着下面的Web service是以对象的方式表示的,但事实并不一定如此:你完全可以把你的Web service写成一系列的C函数,并仍然使用SOAP进行调用。SOAP规范定义了SOAP消息的格式,以及怎样通过HTTP协议来使用SOAP。SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。第三章我们会讨论SOAP,并结识SOAP消息的各种元素。

WSDL
你会怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。
posted @ 2006-03-09 09:55 逍遥草 阅读(1400) | 评论 (1)编辑 收藏
仅列出标题
共5页: 1 2 3 4 5