WebService开发 使用Soap
来源:互联网 发布:小米笔记本12.5java 编辑:程序博客网 时间:2024/05/15 07:06
WebService开发(一) 如何使用Soap头
平时写Web Service时经常会对Service的访问进行安全控制,方法很多,这里介绍一下如何用Soap头来进行控制的一例。
第一步,引用需要用到的名称空间
using System.Xml;
using System.Xml.Serialization;
using System.Web.Services;
using System.Web.Services.Protocols;
第二步,建立自定义的SoapHeader类MySoapHeader
{
string _name;
string _passWord;
public string Name
{
get { return _name; }
set { _name = value; }
}
public string PassWord
{
get { return _passWord; }
set { _passWord = value; }
}
}
第三步,建立WebSerivce,MyService类有一个MySoapHeader类型的字段公共header,在客户调用CheckHeader之前需要给header付一个新实例,服务器端检验这个实例的成员信息。失败我们抛出一个SoapHeaderException,这个异常的新实例,这里调用两个参数的构造函数。第一个参数是自定义的异常原因,第二个参数我们用SoapException.ClientFaultCode表示客户的调用格式不正确或缺少必要的信息。
public class MyService : System.Web.Services.WebService
{
public MySoapHeader header;
[SoapHeader("header", Direction = SoapHeaderDirection.In)]
public string CheckHeader()
{
if (header == null)
{
throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
}
else
{
if (header.Name != "admin" || header.PassWord != "admin")
{
throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
}
}
//业务逻辑.
return "Something done";
}
}
第四步,客户端进行调用,这里的MySoapHeader,和MyService类即为WSDL工具生成代理类,对应服务端的上两个类。我们首先new 一个MySoapHeader的新实例,然后付个Myservice的新实例的header字段,最后调用CheckHeader这个服务器的方法,CheckHeader方法的header!=null,接着进行Name和PassWord的验证。
客户端try-catch块内首先捕获SoapHeaderException(如果有的话)。然后捕获Exception。好了整个过程只需这几步。
{
protected void ClientMethod(string name, string passWord)
{
MySoapHeader h = new MySoapHeader();
h.Name = name;
h.PassWord = passWord;
MyService service = new MyService();
service.header = h;
try
{
string retval = service.CheckHeader();
Console.WriteLine("Return:" + retval);
}
catch (SoapHeaderException soapEx)
{
Console.WriteLine("Soap Header Exception:" + soapEx.Message);
}
catch (Exception ex)
{
Console.WriteLine("Exception:" + ex.Message);
}
}
}
到些为止,利用Soap头的一例简单的介绍完了,扩展应用,就由大家来发挥吧!
下一篇,会介绍一下Soap扩展!谢谢大家!
WebService开发(二) 如何使用Soap扩展
首先,介绍一下几个相关的类。System.Web.Services.Protocols名称空间下SoapExtension,SoapExtensionAttribute是两个抽象类,不能够实例化,我们要做的事情就是分别继承这两个抽象类,实现自定义类。SoapExtensionAttribute又继承自System.Attribute,说明它是一个Attribute(这个东西不太好翻译,有人译成属性之类,我考虑了一下,感觉翻译成标签更形象,为什么呢?我们用这种类时,一般会在类或方法等上方加[Attribute],这就有点像给东西贴一个标签,告诉别人这个有什么特征,作什么用途)。
我们开始实现自定义的SoapExtension和SoapExtensionAttribute,下边是具体代码,代码中用到了对称加密,我封装了一下MSDN里的提供的一个实现,可以下载源文件在这里/Files/DavidFan/Encryptor.rar。需要引用的名称空间,其中包括我封装的加密类所在的名称空间
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Services.Protocols;
using David.Fan.Encrypt;
public class MyExtensionAttribute : SoapExtensionAttribute
{
int _priority = 1;
public override int Priority
{
get { return _priority; }
set { _priority = value; }
}
public override Type ExtensionType
{
get { return typeof(MyExtension); }
}
}
{
//这个override的方法会被调用四次
//分别是SoapMessageStage的BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterDeserialize)//反序列化之后处理
{
bool check = false;
foreach (SoapHeader header in message.Headers)
{
if (header is MySoapHeader)
{
MySoapHeader myHeader = (MySoapHeader)header;
//解密
myHeader.Name = Security.Decrypt(myHeader.Name);
myHeader.PassWord = Security.Decrypt(myHeader.PassWord);
if (myHeader.Name == "admin" || myHeader.PassWord == "admin")
{
check = true;
break;
}
}
}
if (!check)
throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
}
}
public override Object GetInitializer(Type type)
{
return GetType();
}
public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(Object initializer)
{
}
}
{
string _name;
string _passWord;
public string Name
{
get { return _name; }
set { _name = value; }
}
public string PassWord
{
get { return _passWord; }
set { _passWord = value; }
}
}
public class MyService : System.Web.Services.WebService
{
public MySoapHeader header;
[MyExtensionAttribute]
[SoapHeader("header", Direction = SoapHeaderDirection.In)]
public string CheckHeader()
{
//业务逻辑.
return "Something done";
}
}
CheckHeader方法的实现你可以和我上一篇的MyService的CheckHeader方法作一下对比。就看出来Soap扩展的一点好处了。客户端将身份信息加密传送。服务器端拿到加密串进行解密,然后校验,不匹配则摆出异常。
这里只是对Soap扩展使用的一个特别的简单的举例,当然你还可以发挥,比如压缩消息,日志记录,Trace之类,网上也有很多文章讲。谢谢大家!
WebService开发(三)Web Service Software Factory
想了解它是什么?http://www.codeplex.com/servicefactory这里来看。
想要用上它,先安装dotnetfx3.exe,GuidanceAutomationExtensions.msi,Web Service Software Factory - December 2006 (refresh).msi,微软有提供下载,搜一下就找到了。安装好后,新建项目如下
Guidance Packages下还有一个wcf的项目模板,恰好最近园子里有人在讲一系列WCF的文章。下一步
看一下生成的解决方案结构
作为WebService的最佳实践,微软建议我们解决方案大概就是这个样子了。主要我们还是看好它的引用关系,这对理解这个框架是最好的方法。
1.BusinessLogic(业务逻辑)引用BusinessEntities(业务实体)和DataAccess(数据访问层)。
2.ServiceContracts(服务契约)引用DataTypes(数据类型)。ServiceContracts这里通常是接口的定义,我们将[WebService],[WebMethod]应用于接口和接口内方法之上,让任何类继承接口并实现,.asms文件利用<%@ WebService Language="C#" Class="实现接口的类" %>来对外发布服务。来实现操作定义(服务契约)和操作实现的分离。
3.ServiceImplementation(服务实现)引用BusinessEntities(业务实体),BusinessLogic(业务逻辑),ServiceContracts(服务契约)和DataTypes(数据类型)这四个层。ServiceImplementation内利用“翻译器”将DataTypes(数据类型)和BusinessEntities(业务实体)这两层进行转换,以达到服务涉及类型的松耦合。还有一个原因就是业务层的的业务对象(DataType)可能和持久层(BusinessEntities)或者数据层(DataAccess)的存储大相径庭。
4.WebService.Host引用ServiceImplementation,对外发布服务。
它提供了一个叫EmployeeService的示例解决方案,大家可以研究一下。
- WebService开发 使用Soap
- 使用SOAP开发Java Webservice详解
- 使用SOAP开发WebService 服务--Axis解决方案
- 使用CXF 开发SOAP webservice 服务端实例
- 使用AXIS进行webservice开发-添加SOAP Header
- WebService开发(一) 如何使用Soap头
- 使用CXF 开发SOAP 的webService接口客户端
- Java开发之Webservice中的soap服务使用
- Python开发Webservice(SOAP)
- PHP使用SOAP做webservice
- 使用Soap方式调用Webservice
- C#开发XML WebService接口(SOAP)
- 利用SOAP扩展开发WebService(PHP)
- 利用SOAP扩展开发WebService(PHP)
- C#开发XML WebService接口(SOAP)
- CXF结合Spring 开发SOAP WebService服务
- 使用SOAP开发java
- WebService从零到项目开发使用1—技术研究之基础篇 SOAP
- 摘抄 文件读取
- 加载xib的两种方法
- 排序算法十一:计数排序
- 敏捷开发——scrum采用的关键说法
- Objective-C 类声明,定义,实例,初始化
- WebService开发 使用Soap
- oracle赋权和job操作
- opengl中的坐标系
- spring注解和非注解使用bean的流程原理
- ssh服务器拒绝了密码 请再试一次
- 用Java生成字符画
- tair(一)--入门
- PHP 基础
- C++使用SQLite3心得 -- sqlite3以二进制形式存取图片(MFC,CppSQLite3U封装类)