林子之大.net笔记

本站多数文章由其它网址转载,没啥技术含量的皆为原创。主要目的是对付记性不好,方便查询。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
1.SOAP:Simple Object Access Protocol ^{Symbolic Optimal Assembly Program}.
2.1.HTTP-GET 
2.2.HTTP-POST

Soap

定义:
SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。



特性:
这个定义确实体现了 SOAP 现在的主旨。 SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点(参见图 1)。 为此,它提供了一种基于 XML 且具有以下特性的消息处理框架:
1) 可扩展,
2) 可通过多种底层网络协议使用
3) 独立于编程模型。

 以下将分别详细讨论这三种特性。

按此在新窗口浏览图片
简单的 SOAP 消息处理

1:SOAP 可扩展性是关键所在。 在这个缩写词还代表某些含义时,"S" 意味着“简单”。 如果我们从 Web 中学到了一样东西,那就是,简单性总是比效率和纯技术更重要,因而互操作性成败的关键,就在于必须绝对要求简单性。 简单性仍然是 SOAP 的主要设计目标之一,这一点的例证就是 SOAP 缺少分布式系统的很多特性(如安全性、路由和可靠性等)。 SOAP 定义了一种通信框架,允许以分层扩展的形式随着时间推移而加入这些特性。 Microsoft、IBM 和其他软件厂商正在积极开发一个 SOAP 扩展的通用套件,该套件将加入大多数开发人员期待的特性。 这一计划被称为全局 XML Web 服务结构 (GXA)Microsoft 已经发布了针对若干 GXA 规范的一个参考实现,并将其命名为 Web Services Enhancements 1.0 SP1 for Microsoft .NET (WSE)。 


2:SOAP 可在任何传输协议(诸如 TCP、HTTP、SMTP,甚至是 MSMQ)上使用(参见图 1)。 然而,为了保持互操作性,需要定义一些标准协议绑定以便草拟用于每种环境的规则。 SOAP 规范提供了一种用于定义任意协议绑定的灵活框架,并且由于 HTTP 的使用极为广泛,它现已为 HTTP 提供了一种显式绑定。

3:SOAP 允许任何编程模型,并且不依赖于 RPC。 大多数开发人员立刻将 SOAP 与对分布式对象进行的 RPC 调用等效起来(因为 SOAP 最初就是关于“访问对象”的),但实际上,基本的 SOAP 模型更接近于传统的消息处理系统,如 MSMQ。 SOAP 定义了一种模型以便处理个别的单向消息。 你可以将多条消息组合成一条整体的消息交换。 图 1 说明了一种简单的单向消息,其中发送方不会收到响应。 但是,接收方可以向发送方发回一条响应(参见图 2)。 SOAP 允许使用任何数量的消息交换模式 (MEP),请求/响应只是其中一种。 其他示例包括要求/响应(与请求/响应相对)、通知和长期运行的点对点对话等。

按此在新窗口浏览图片
请求/响应消息交换模式

开发人员经常将请求/响应与 RPC 混为一谈,而实际上二者之间的差别很大。 RPC 使用请求/响应,但请求/响应不一定就是 RPC。 RPC 是 一种允许开发人员进行方法调用的编程模型。 RPC 需要将方法签名转换成 SOAP 消息。 鉴于 RPC 的广泛应用,SOAP 草拟了一项协议,以便将 RPC 用于 SOAP。

具备这三种主要特性,SOAP 消息处理框架就促进了在异构环境中交换 XML 消息,而在这类环境中,互操作性长久以来都是极大的挑战。



HTTP


HTTP-GET
定义:
HTTP-GET是超文本传输协议的一种,依靠唯一的URI把数据传输.

特点:
。将数据添加到URL 
。利用一个问号(”?”)代表URL地址的结尾与数据的开端。 
。每一个数据的元素以 名称/值 (name/value) 的形式出现(以&分割)。
。利用一个分号(“;”)来区分多个数据元素。 


HTTP-POST
定义:
HTTP-POST是超文本传输协议的一种,依靠用户发送的数据头获取数据.



特点:


。将数据包括在HTTP主体中。 
。同样的,数据的元素以 名称/值 (name/value) 的形式出现(以&分割)。 
。但是每一个数据元素分别占用主体的一行


HTTP和SOAP

HTTP的优势(参考资料):
。 能够非常容易的创建正确的HTTP-GET 和 HTTP-POST消息,当面向的客户是不能使用SOAP的客户时,HTTP-GET 和 HTTP-POST是最好的选择。 

。响应HTTP-GET 和 HTTP-POST的消息,并不需要复杂的XML处理。响应之中包括了XML,但它有一个简单的框架并能够轻易的利用一般的技术处理响应。这些特点使HTTP-GET 和 HTTP-POST对于不支持XML的平台来说,变的异常的有用。 

。HTTP-GET 和 HTTP-POST消息比起SOAP消息来说,更为简单。这有利于提高整体的性能。


缺点(参考资料):
。不能够利用HTML调用XML Web Service中的以复杂数据类型为参数的方法。 

。你可以调用XML Web Service中返回值为复杂数据类型的方法,但是响应将仅包括复杂数据类型中各个区域中的名字/值,并且返回的值并没有结构可言。你必须手动的将数据解压缩到WSDL文件。 

。在HTTP中,你不能使用reference进行参数的传输。 

。使用HTTP与XML Web Service进行交流,不是一个agreed-to工业标准技术。虽然HTTP会在ASP.NET Web Application中与XML Web Service正常工作,但不保证它在其它的环境下正常工作。 

注意事项:

 Cookie是依赖于Http传输协议的,如果说Soap可以读取Http产生的Cookie的话这是不可能的,Soap只能每次发送Cookie的库,获取才可以处理.

  Soap相比HTtp协议较慢,如果不是非常有必要,不要其传输大数据块.

  soap必定是符合W3C的XML文件,在C#中,发送的HttpWebRequest中:

Stream stm = req.GetRequestStream();
doc.Save(stm);

即可实现发送,如果需要获取:
        
WebResponse resp = req.GetResponse();
stm = resp.GetResponseStream();
StreamReader r = new StreamReader(stm);


  发送一个Soap,在Web编程中,都是依靠于HTTP-POST的方式,Php中发送一个POST请求如下函数:

<?php

function httpPostRequest($host, $path, $arrPostvars, $port=80, $referer=""){ 
  $arrEncodedPairs = array(); 
  $res = ""; 
  foreach ($arrPostvars as $var => $value) 
      $arrEncodedPairs[] = rawurlencode($var)."=".rawurlencode($value); 
  $postData = implode("&", $arrEncodedPairs); 
  $request = "POST $path HTTP/1.1\n". 
  "Host: $host\n". 
  (($referer) ? "Referer: $referer\n" : ""). 
  "Content-type: application/x-www-form-urlencoded\n". 
  "Content-length: ".strlen($postData)."\n". 
  "Connection: close\n\n". 
  $postData."\n"; 
  if ($fp = fsockopen($host, $port)) { 
    if (fputs($fp, $request)){ 
      while(! feof($fp)){ 
       $res .= fgets($fp, 128); 
      } 
      fclose($fp); 
      return $res; 
    } 
  } 
}
?>

使用的时候:
echo(httpPostRequest('s','/myps/webs.asmx/IsLogin',array("Input"=>"my Input"),81));


  Http是无状态的协议,比如:


private string MyName;
[WebMethod]
public void SetMyName(string Input){
  this.MyName=Input;
}
[WebMethod]
public string GetMyName(){
 return  this.MyName;
}

如果你使用
    
Ws_App.SetMyName("cookies");
returnint.Text = Ws_App.GetMyName();


这是不能获取值的.可以参考:

    
[WebMethod (EnableSession=true,MessageName="SetSession")]
public void SetSession(string Input){
 Context.Session["oop"]=Input;
}
[WebMethod (EnableSession=true,Description ="GetSession",MessageName="GetSession")]
public string GetSession(){
 return Context.Session["oop"].ToString();
}



  要熟练掌握Web服务,以上知识必须理情.
posted on 2008-03-03 17:33  林614  阅读(1685)  评论(0编辑  收藏  举报