创建一个自定义代理
既然已经了解了为什么Web服务返回一个SOAP错误我们就可以创建一个自定义代理来生成网服务期待的SOAP包装虽然创建一个自定义SOAP包装肯定比使用一个由VSnet或者WSDLexe公用程序生成的SOAP包装要花更多的时间但是这样做可以完全控制包装的内容为了开始创建自定义代理我创建一个名为msnewsserviceproxy的包含两个字段的新类
以下为引用的内容
public class MSNewsServiceProxy {
string _uri;
string _soapAction;
}
uri字段保存了Web服务的位置而_soapAction字段保存了将要使用SOAP包装发送的SOAPAction数据头的名称在MSNewsServiceProxy类之内添加CreateSoapEnvelope ()SendSoapEnvelope ()和FilterResult ()这三个方法这些方法生成SOAP包装请求把它发送到Web服务然后过滤返回的SOAP包装让我们逐一的看看每个方法注意代码在SOAP包装的根元素上添加一个SOAP ENV域名空间前缀Web服务显然需要这个特定的前缀而拒绝任何不包含这个前缀的信息因为VSnet生成的代理发送一个soap域名空间前缀(而不是SOAP ENV)所以它的消息被拒绝Web服务不应该需要一个特定的域名空间前缀而为此拒绝不带此前缀的消息但是域名空间问题也是你必须注意要想使工作更好的完成要执行一些看上去不{>可思议的事情
在SOAP包装被创建之后SendSoapEnvelope ()方法(见代码段)使用了几个SystemNet和SystemIO域名空间中的类来把这个包装发送到Web服务中代码首先通过把_uri变量传送到对象构造器来创建一个HttpWebRequest对象其次与这个请求相关联的相应的MethodContentType和Header都将被发送
然后一个StreamWriter对象和HttpWebRequest对象的请求流相关联SOAP包装就被使用StreamWriter的Write ()方法写到流中
从Web服务返回的SOAP包装被HttpWebResponse对象的SendSoapEnvelope ()方法获得
HttpWebResponse response = (HttpWebResponse)request
GetResponse();
如果应答不是空值它将被载入一个XMLTextReaderXMLTextReader被用来填充XmlDocument对象然后从这个方法中返回XmlDocument对象
FilterSoapEnvelope ()方法分析SOAP应答包装并把从Web服务中返回的数据装入自定义代理的消费者使用的XmlDocument对象
以下为引用的内容
private XmlDocument
FilterSoapEnvelope(
XmlDocument doc) {
XmlDocument filterDoc =new XmlDocument();
XmlNode result = docSelectSingleNode(//results);
XmlNode resultImport = filterDocImportNode(resulttrue);
filterDocAppendChild(resultImport);
return filterDoc;
}
虽然过滤器可以使用好几种方法执行但是FilterSoapEnvelope ()方法依靠XPath语句可以在应答SOAP包装中得到结果元素
微软新闻组PHP Web服务展示了允许取得新闻组新闻摘要的两种方法getheaders ()和getmessage () 你可以看到如何在自定义代理类中使用这两种方法(见代码段) 注意每个方法中的代码传递Web服务方法名被调用到CreateSoapEnvelope ()方法和任何使用这个方法关联的参数 在SOAP包装被发送以及应答被接受之后FilterSoapEnvelope ()方法被调用来把返回的数据加载到一个XmlDocument对象中同样这个对象也是代理消费者使用的
[] []