WSE 2.0开发体验(1) ----C#语言篇

随序:

最近因为从事一个项目的开发,让我有机会近距离的接触WSE2.0,也算是有一些体会,事情告一段落了,人也就闲下来了。觉得自己也应该学会记载自己做过的事情。否则出现前面作了后面忘了,那样的话,就太可惜了,另一方面,也希望我的所得能够给后来者一些帮助。基本上我也是采取回忆的形式,想起什么,就写下什么。希望看到的人不会觉得不习惯。

 

Trace Tool----WSE开发的必不可少的工具。

我使用的就是Soap Toolkit 3.0,还有一款就是Wse3Trace。虽然有人推荐我用,但是我觉得Soap Toolkit 很好用,所以就没有用。Soap Toolkit使用的时候只要将你自己的Web Reference中的地址端口改成你在Soap toolkit中设置的就可以了,比如你在soap toolkit中使用了8080端口,你就将你的Web Reference中的地址中的端口改成8080就可以了。那么此时你的请求就会转发给了Soap toolkit,他就会帮你显示出你的消息格式,同时他还会帮助你转发你的请求到相应的80端口,也就是你的服务实际地址。

How to Debug?

       WSE开发过程中,遇到一个很严重的问题就是如何去调试,大家都知道传统的Web Services程序可以通过调试进入到Web Services的方法体内的。但是WSE开发的解决方案特别是那些基于路由地解决方案无法进行调试,这样很多的时候你无法的具体的程序错误出在什么位置,那么这个时候也就是我们需要使用Trace Tool的一个优点。因为服务方出了错误都是可以在消息中查看得到的。所以有时,当我确定错误出在什么位置的时候我就会察看通过Soap Toolkit获得消息内容,或者是在我怀疑的位置,怀疑的变量通过

              string errorStr = “”;

              throw new exception(errorStr);

这样的方式,将这些变量的值显示在Soap 消息中,用这种变通的方法来进行调试。

一些错误地解决办法:

在使用WSE 2.0的时候出过好多的错误,大部分的情况下你都可以使用Trace工具来得知发生在那一行,然后再去纠正,但是有些错误是无法Trace到哪一行,我只能依靠回忆将我的经历和大家分享了。

错误一:

****** Exception Raised ******

System.Web.Services.Protocols.SoapException:

SOAP-Fault code: http://schemas.xmlsoap.org/ws/2004/03/addressing:DestinationUnr

eachable

Message: Microsoft.Web.Services2.Addressing.AddressingFault: Destination Unreach

able ---> System.Exception: WSE816: The <To> header must match the value of an i

ncoming message's HTTP Request Url if the soap receiver does not have an actor n

ame. The <To> header received contained "http://localhost:8080/RemoteWSRouter/He

lloService.ashx" while the HTTP Request Url was "http://localhost/WSSample/Hello

Service.asmx".

解决方法。这是你使用了WSE中来写自己的路由器的时候可能会出现的问题,这个问题解决办法应该是在你的终端服务的Class 加上你的路由器的地址如下:

       [SoapActor("http://localhost:8080/RemoteWSRouter/HelloService.ashx")](你的路由器地址)

     public class HelloService : System.Web.Services.WebService

解决方法的问题:用这种方法虽然能够解决这个问题但是会在逻辑上出现一个问题,那就是对于终结点来说,它需要去指导路由器的地址,而这在有的时候是不太合理的。这个问题我很疑惑,现在也没有解决。特别是对于那种多点动态路由器的时候。希望有人能够解决了,告诉我。

错误二:

****** Exception Raised ******
System.Web.Services.Protocols.SoapException:
SOAP-Fault code: http://schemas.xmlsoap.org/soap/envelope/:Server
Message: Server unavailable, please try later

看到这样的代码不要真地以为你的服务器不可达,这种错误一般是因为你在中间的路由器或者服务器上的Web.Config文件中的detailedErrors设置,没有设置为显示详细的错误信息。你可以更改为下面:

           <detailedErrors enabled="true" />

就可以看到详细的或者具体的错误信息。

错误三:
Microsoft.Web.Services2.Security.SecurityFault: Referenced security token could not be retrieved
  at Microsoft.Web.Services2.Security.EncryptedKey.LoadXml(XmlElement element)
  at Microsoft.Web.Services2.Security.EncryptedKey..ctor(XmlElement element)
  at Microsoft.Web.Services2.Security.Security.LoadXml(XmlElement element)

这种错误一般是由于你使用了证书的安全方式,但是你的却没有这个证书,你可以去你的mmc->证书里面去查看相应位置的相应证书。

错误四:

System.Web.Services.Protocols.SoapException: SOAP-Fault code: http://schemas.xmlsoap.org/soap/envelope/:Server Message: System.Web.Services.Protocols.SoapHeaderException: Server unavailable, please try later ---> System.InvalidOperationException: Private Key is not avail able    at Microsoft.Web.Services2.Security.Cryptography.RSACryptoServiceProvider.Dec rypt(Byte[] ciphertext, Boolean useOAEP)    at Microsoft.Web.Services2.Security.Cryptography.RSA15KeyExchangeFormatter.De cryptKey(Byte[] cipherKey)

这个错误尤其在我们刚开始使用WSE2.0的时候,我们在使用WSE的例子程序AsymmetricEncryption的时候常常会出现,一般出现这个问题,或者在我们是用AsymmetricEncryption例子的时候我们需要作以下工作:

1:按照AsymmetricEncryption例子中使用状况来说它里面使用了WSE2QuickStartServer的两个证书,文件名分别为Server Public.cer, Server Private.pfx.他们分别用于:

Server Public.cer,用于客户端加密、签名等用途,按照程序的需要安装在当前用户证书的其他人位置。好像英文叫做Other pepole。如果你的mmc的证书管理下面没有其他人这个节点,那么你可以参考下面文章去加一个这样的节点https://blogs.msdn.com/kaevans/archive/2005/04/22/410851.aspx

Server Private.pfx,用户服务器端解密、验证签名用途,按照程序的需要安装在本地计算机的个人下面。

安装完了证书过后并没有完事,我们还需要设置一下对这个证书的私钥文件的访问权限。因为你的服务器端的程序是运行的Web Service所以你必须设置ASP.Net用户对你的私钥文件的访问权限,你可以使用X509 Certificate Tool,就是WSE 2.0安装的时候自带的工具。一般你经过这样的设置,你的AsymmetricEncryption程序就可以运行了。

注意:在这里可能会出现一个问题,当我们在做路由得时候,我们的客户端程序本身也是一个Web Service的时候,就会出一个问题,设想此时我们应该将我们的客户端所获得的服务器公钥证书放在什么位置呢?还放在当前用户的其他人目录么?错,原因是当前用户已经成了ASP.Net用户,因为我本身就是在做路由功能,所以我按照例子类似的代码,结果却发现作为客户端的路由器找不到证书,后来我就把客户端的公钥证书也安装到了本地计算机的Other pepole下面,然后对WSE Sample中的程序作了一些修改,让他从该位置来读取,从而解决了这个问题。

小结:中午花了睡觉的时间来写这篇文章,仓促之下,也没有完全整理思路,可能有些零乱,希望下次能够有所改善吧,而今天居然收到老板命令,让我把已经做好的WSE2.0的应用转到WSE3.0上,还要装VS 2005,那叫一个痛苦哦。算了,忍了,希望到我转成功了过后能够再有一些转化的心得和大家分享。