欢迎光临
我们一直在努力

用ASP.NET开发Web服务的五则技巧-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

一、禁用http post/get协议

  除非另外指定,否则,.net将试图把web服务绑定到三种协议:http/post、http/get和soap。之所以说“试图”,是因为依赖于服务的参数和返回类型,http/get协议可能不可用。.net生成的wsdl文件将自动包含绑定这三种协议的指令,客户程序可以自由选择使用哪种协议与服务通信。

  只要在web.config文件中加入下列内容,就可以方便地删除对http/post和http/get协议的绑定:

<webservices>

<protocols>

<remove name="httppost" />

<remove name="httpget" />

</protocols>

</webservices>

  为什么要避免通过http/post和http/get协议引出web服务呢?主要的两个原因是安全和互操作性。http/get的安全性不如soap,而且由于http/get常见于web链接,怀有恶意的人可能利用它实施欺骗,使别人在不知不觉中用自己的安全标识调用web服务,却还以为自己在点击web链接。

  就互操作性而言,soap是广泛应用的web服务通信标准,而http/get和http/post不是。因此,对于.net生成的wsdl文档中默认包含的http/get和http/post绑定,许多自动生成代理服务器的工具不会理解。因此,如果你的web服务不是非绑定到http/get和http/post协议不可,最好取消这两种绑定。

二、用tcptrace查看soap请求/应答消息

  对于开发web服务应用的人来说,调试可能是件异乎寻常的难事,因为无论是.net sdk还是vs.net,都没有提供工具来查看客户端和服务器之间的soap消息。

  如果.net和非.net的客户端、服务器端的交互过程出现了问题,要想找出问题的根源,拥有查看soap消息的能力就尤为重要,因为这类问题往往与soap消息的格式有关(例如,“消息中包含了soapaction 吗?”)。

  tcptrace(www.pocketsoap.com/tcptrace)是一个查看这类消息交换过程的优秀工具,它通过设置一个客户端和服务器端之间的隧道工作。启动tcptrace时,它会要求输入目标url和端口号,以及tcptrace监听的本地端口号。这样,你就可以通过设置代理stub的url属性,把stub指向这个本地端口(例如,localhost:8080)。tcptrace能够记录所有的请求和应答http消息。

  tcptrace的一个局限是,它在消息流程中所处的位置决定了它不能用来查看通过ssl发送的消息。如果你要查看通过ssl发送的soap消息,只能编写一个定制的isapi过滤器。

三、简化接口设计

  在众多有关n-层应用设计的论述中,简化接口设计这一设计要诀可以说是随处可见。但是,对于web服务这样的分布式计算环境,简化接口设计的重要性更加突出。

  在设计分布式应用时,出于性能和可伸缩性的考虑,应当保证客户端和服务器端之间的调用尽可能地少。减少网络调用不仅有利于减少通信开销(如果只用一个soap消息可以达到目标,就绝对不要发三个消息),降低网络流量,而且提高了应用的性能。显然,这一切都是开发者梦寐以求的目标。那么简化的接口到底有何特征呢?

  首先来看一个复杂接口的例子:

namespace chattyservice {

public class chattyservice : webservice {

private string username;

private string password;

public string username {

[webmethod]

set {

username = username;

} }

public string password {

[webmethod]

set {

password = password;

} }

[webmethod]

public bool logon() {

// 验证身份

return true;

}

}

}

  在这个例子中,username和password是两个属性,调用logon()方法之前首先必须设置这两个属性。有一个问题光看这段代码不太容易注意到,这就是username和password都作为web方法引出。这就是说,每次对属性的get/set操作都会导致一个对服务的调用。

  按照简化接口设计的要求,改进后的代码如下:

namespace chattyservice {

public class chattyservice : webservice {

[webmethod]

public bool logon(string username, string password) {

// 验证身份

return true;

}

}

}

  现在,username和password成了logon()方法的参数。修改之后的代码的优点在于,它把登录操作对服务器的三次调用降低到了一次。另一方面,如果参数的个数太多,这个方法可能看起来很不像样。这时,可能要把方法的参数整理成几个复杂类型,例如,把username和password两个参数封装到一个credential(证书)对象里面。

四、在web.config中保存应用私有的数据

  用asp.net开发的web服务能够发挥出.aspx应用的所有特长,包括用web.config文件保存应用私有数据的能力(例如,数据库连接字符串、文件路径等)。用web.config而不是global.asax文件的好处在于修改配置之后不必重新构造应用。

五、避免使用asp.net会话状态

  .net实现的会话状态管理功能解决了它的前辈asp 3.0存在的许多问题,例如请求串行化等,但仍存在一些局限。应当认识到,.net的会话状态管理功能不是专门为web服务环境中的会话状态而设计,而是为了在范围更广泛的asp.net应用中管理会话状态而设计,它依赖于http cookie(有一种通过改写url实现的不需要cookie的模式,但不适用于web服务)。

  cookie是http独有的。在web上,所有的浏览器都支持http,所以cookie非常适合在web应用中使用。但是,在web服务中应用cookie却把服务限定到了http协议上。另一方面,soap协议的运行是独立于传输协议的,因此如果把web服务应用限制到http协议上,应用的灵活性也受到了限制,一旦要通过非http的传输协议(例如smtp)提供服务,事情会变得很麻烦

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 用ASP.NET开发Web服务的五则技巧-.NET教程,Asp.Net开发
分享到: 更多 (0)