参考地址:http://www.cnblogs.com/zhili/p/WebService.html

一、WebService概述

SOAP、WSDL、UDDI
SOAP(Simple Object Access Protocal,简单对象访问协议),是在分散或在分布式环境中交换信息的简单协议。
WSDL(Web Services Description Language,Web服务描述语言) 对WebService 的解释说明文档,描述Web服务发布的XML格式
UDDI 统一描述、发现和集成(Universal Description, Discovery, and Integration)的缩写,是Web服务的黄页,它是一个基于XML的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务供其他客户查询使用。
趣味理解:
Web Service 好比是一个服务供应商;
SOAP 就像是两个公司之间签的合同,约束双方按照一定的规范和标准做事;
WSDL就像说明书,告诉别人你有什么,能给别人提供什么服务;
UDDI好比你的公司需要在黄页或工商注册,方便别人查询

二、WebService执行过程

  • 在客户端上,创建了一个Web Services代理类的实例。该对象驻留在客户端机器上。
  • 客户端调用代理类上的方法
  • 客户端机器将Web Services方法的参数序列化为SOAP消息,然后通过传送协议发送给Web Services。
  • Web Services底层结构接收SOAP消息并进行反序列化。它会创建Web Services的类的实例,同时调用对应的Web Services方法。
  • Web Services方法执行,并返回结果。
  • Web Services底层结构会将返回结果序列化为SOAP消息,然后通过网络发送回客户端。
  • 客户端将接收SOAP消息,然后将XML反序列为返回值或任何输出参数,并将它们传递给代理类的实例。
  • 客户端接收返回值和所有输出参数。

三、WebService的优缺点

优点:

1.跨平台:Web Services完全基于XML(可扩展标记语言)、XSD(XMLSchema)等与平台无关的行业标准。

2.自描述:Web Service使用WSDL进行自我描述,包括服务的方法、参数、类型和返回值等相关信息。

3.跨防火墙:Web Service使用http协议进行通信,可以穿越防火墙。

缺点:

1.效率低下,不适合做单应用系统的开发。

2.安全问题:Web Services没有自身的安全机制,必须借助Http协议或IIS等宿主程序实现信息安全加密。

四、使用参数介绍

Web Service(Web 服务)提供以下属性。

Namespace:默认是"http://tempuri.org/",此属性的值包含 XML Web Service 的默认命名空间。XML 命名空间提供了一种在 XML 文档中创建名称的方法,该名称可由统一资源标识符(URI)标识。使用XML命名空间,可以唯一标识XML文档中的元素或属性因而,在 XML Web Service 的服务说明中,Namespace 被用做与 XML Web Service 直接相关的XML 元素的默认命名空间。如果不指定命名空间,则使用默认命名空间http://tempuri.org/。

Name:此属性的值包含 XML Web Service 的名称。在默认情况下,该值是实现 XML Web Service 的类的名称。

Description:此属性的值包含描述性消息,此消息将在 XML Web Service 的说明文件(例如服务说明和服务帮助页)生成后显示给 XML Web Service 的潜在用户。

WebMethod(Web 服务方法)有以下 6 个属性。

Description:是对 Web Service 方法的描述信息。就像 Web Service 方法的功能注释,可以让调用者看见的注释。

EnableSession:指示 Web Service 是否启动 Session 标志,主要通过 Cookie 完成,默认为 false。

MessageName:主要实现方法重载后的重命名:

TransactionOption:指示 Web Service 方法的事务支持。

CacheDuration:设置响应应在缓存中保留的秒数。这样 Web Service 就不需要重复执行多遍,可以提高访问效率,而 CacheDuration 就是指定缓存时间的属性。

五、代码

TestWebService1.asmx文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols; namespace WebService
{
/// <summary>
/// TestWebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://www.anniya.com/api")]//
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
[System.Web.Script.Services.ScriptService]
public class TestWebService1 : System.Web.Services.WebService
{
[WebMethod]
[SoapHeader("myHeader")]
public string HelloWorld(string name)
{
if (!myHeader.IsValid())
{
return "对不起,您没有权限访问";
}
return name + ",Hello World";
} public MySoapHeader myHeader = new MySoapHeader();
[WebMethod]
public List<Student> GetStudent()
{ return new List<Student>()
{
new Student() {Id = , Name = "张三1"},
new Student() {Id = , Name = "张三2"},
new Student() {Id = , Name = "张三3"}
};
} [WebMethod(Description="根据学生列表进行处理")]
public List<Student> GetStudentResultByStudentList(List<Student> student)
{
foreach (var stu in student)
{
stu.Name += ",已经处理过了";
}
return student;
} } public class Student
{
public int Id { get; set; }
public string Name { get; set; }
} public class MySoapHeader : SoapHeader
{
public string UserName { get; set; }
public string Password { get; set; } public bool IsValid()
{
if (UserName == "admin" && Password == "")
{
return true;
}
else
{
return false;
}
} } }

调用代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplicationTestWebService.ServiceReference1; namespace WebApplicationTestWebService
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
using (TestWebService1SoapClient client = new TestWebService1SoapClient())
{
MySoapHeader myHeader = new MySoapHeader();
myHeader.UserName = "admin";
myHeader.Password = "";//用户名和密码要和调用的Web Service 一致
Response.Write(client.HelloWorld(myHeader, "yxl") + "</br>");
Response.Write("<hr/>");
Student[] students = client.GetStudent();
foreach (var student in students)
{
Response.Write(student.Name+"</br>");
}
Response.Write("<hr/>"); foreach (var student in client.GetStudentResultByStudentList(students))
{
Response.Write(student.Name + "</br>");
}
} }
}
}

如果使用ajax调用并且跨域的话,可以在本地应用程序中调用webservice,然后在用js调用本地应用程序,这样就不会跨域了

安全除了使用SoapHeader,还可以使用SSL,配置SSL网站,还可以控制访问的IP地址,但是ip地址的维护不方便,不推荐使用

WCF分布式开发必备知识(3):Web Service 使用的更多相关文章

  1. WCF分布式开发必备知识(2):.Net Remoting

    .Net Remoting技术,我们可以将其看作是一种分布式处理方式.作为应用程序之间通信的一种机制,.Net Remoting与MSMQ消息队列不同,它不支持离线脱机消息,另外只适合.Net平台间程 ...

  2. WCF分布式开发必备知识(1):MSMQ消息队列

    本章我们来了解下MSMQ的基本概念和开发过程.MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一 ...

  3. WCF分布式开发步步为赢(7):WCF数据契约与序列化

    本节继续学习WCF分布式开发步步为赢(7):WCF数据契约与序列化.数据契约是WCF应用程序开发中一个重要的概念,毫无疑问实现客户端与服务端数据契约的传递中序列化是非常重要的步骤.那么序列化是什么?为 ...

  4. WCF分布式开发步步为赢(1):WCF分布式框架基础概念

    众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...

  5. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  6. WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

    之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...

  7. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  8. java web开发必备知识

    从各种招聘网站的要求上筛选出了一些java开发的一些基本的要求,对照自身看看有哪些缺陷. java基础 既然是java web开发,java SE肯定要学好了. 多线程,IO,集合等,对队列,缓存,消 ...

  9. 移动web开发(一)——移动web开发必备知识

    参考: 移动终端开发必备知识.http://isux.tencent.com/mobile-development-essential-knowledge.html

随机推荐

  1. Sqli-LABS通关笔录-6

    第六关跟第五关一样的是布尔型盲注技术. 只是在部分有出路 添加一个单引号.程序无反应.双引号和斜杠可使其报错. 这一关让我学到了 1.管他三七二十七报错看看语句再说. THE END

  2. Sqli-LABS通关笔录-2

    在这个关卡学习到了 1.程序的错误不是学校收费乱来的,单引号的错误和减号的错误要明白 单引号报错. 用第一关的PAYLOAD尝试了下. 来看看源码: 那么我们构造的sql也就变成了 $sql=&quo ...

  3. linux kernel i2c底层代码跟踪

    其实跟上次跟的平台总线有关 在arch/arm/mach-mx6/board-mx6q_sabresd.c 文件中 static void __init mx6_sabresd_board_init( ...

  4. Python自动化之常用模块

    1 time和datetime模块 #_*_coding:utf-8_*_ __author__ = 'Alex Li' import time # print(time.clock()) #返回处理 ...

  5. IntelliJ IDEA 创建项目project和module的关系

    使用基于IntelliJ的IDE,如phpstorm.android studio都会对project和module的关系比较糊涂.用简单的一句话来概括是:IntelliJ系中的Project相当于E ...

  6. Mybatis 3.3.0 Log4j配置

    最近做一个SSM学习项目,配置log4j,mybatis用下面的方式配置,不管用,打印不出执行的SQL语句. log4j.logger.java.sql.Connection=DEBUGlog4j.l ...

  7. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified)

    http://blog.sina.com.cn/s/blog_4aedf6370101j9tz.html 1. SQL Server 2008 R2 Developer (x86, x64, ia64 ...

  8. shell脚本实现拷贝大文件显示百分比的代码分享

    #!/bin/sh strace -q -eread cp -- "${1}" "${2}" 2>&1 \| awk '{    count += ...

  9. hdu4117

    题意:给出一串单词,每个有一个权值.顺序不变的情况下,删掉一些,使得相邻两单词,前一个是后一个的子串.同时要求使得剩余单词权值和最大.求最大是多少. 分析: AC自动机+线段树+DP. 这是一个比较复 ...

  10. hiho一下第一周 最长回文子串

    题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...