webservice,soap,wsdl的问题,请各位进来看看,300分酬谢....

michael_zy 2006-11-17 08:57:56
以前提过一个类似的问题,以为自己已经得到解决,哪知行不通.
请大家看测试完整代码....
[WebService(Namespace = "http://tempuri.org/")]
//[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {

//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}

[WebMethod]
[SoapRpcMethod(Use=System.Web.Services.Description.SoapBindingUse.Encoded)]
public void Test(Master master)
{

}

public class Master
{
public string Name;

[System.Xml.Serialization.XmlElement]
public List[] ListField;

}

public class List
{
public string Item;
}

}

得到的wsdl文件中描述为(一部分,主要是参数那块):
<s:complexType name="Master">
- <s:sequence>
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="ListField" type="s0:ArrayOfList" />
</s:sequence>
</s:complexType>
用xmlspy测试soap消息是:
<m:Test xmlns:m="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<master xsi:type="m0:Master">
<Name xsi:type="xsd:string">String</Name>
<ListField xsi:type="SOAP-ENC:Array"/>
</master>
</m:Test>
然后发送请求到服务器,根本无法发出,会提示"无法将类型 System.Xml.XmlNode[] 的对象分配给类型 Service+List[] 的对象。"

但是我将webservice中的方法改成 [SoapRpcMethod(Use=System.Web.Services.Description.SoapBindingUse.Literal)]
生成的wsdl文件的描述为:
<s:complexType name="Master">
- <s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="unbounded" name="ListField" type="tns:List" />
</s:sequence>
</s:complexType>
用xmlspy请求soap消息为:
<m:Test xmlns:m="http://tempuri.org/">
<master>
<m:Name>String</m:Name>
<m:ListField>
<m:Item>String</m:Item>
</m:ListField>
</master>
</m:Test>
可以发送成功,但是目前对方并不支持Literal的方式,必须为Encoded方式,请大家帮我解决,谢谢.
如何在rpc+Encode方式下传递我类似上面描述的参数,并且用soap发送成功。请注意不要用.net的测试代码调用webservice的方法,是没有意义的,第一种方法,如果用代码调用也是可以行的,但是soap发送不了,对方根本传递不到数据过来。
...全文
291 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
michael_zy 2006-11-22
  • 打赏
  • 举报
回复
就我所知道的,对方用java做的webservice可以实现rpc+encoded传递复合型参数的.难道是.net 平台的局限.
目前我已经改成document+literal,让对方去修改发送的程序.

但是这个问题我想把它弄明白
heartdevil 2006-11-22
  • 打赏
  • 举报
回复
具体的我也不是太清楚.我只知道,有些模式是不支持数组的。
heartdevil 2006-11-22
  • 打赏
  • 举报
回复
Up
michael_zy 2006-11-21
  • 打赏
  • 举报
回复
请大家支持
股神 2006-11-21
  • 打赏
  • 举报
回复
up
crystal2005 2006-11-20
  • 打赏
  • 举报
回复
顶一顶
jcyluck 2006-11-18
  • 打赏
  • 举报
回复
天书一般
狂顶一番
michael_zy 2006-11-18
  • 打赏
  • 举报
回复
大家顶一顶
yicol 2006-11-17
  • 打赏
  • 举报
回复
我昏,真的不明白
michael_zy 2006-11-17
  • 打赏
  • 举报
回复
heartdevil(困兽)说的表头是soap头么?如果是soap头就没有作用了,只是一个验证的功能.
woaiwoaiyuyu 2006-11-17
  • 打赏
  • 举报
回复
不懂,顶吧
llyzcy 2006-11-17
  • 打赏
  • 举报
回复
UP
michael_zy 2006-11-17
  • 打赏
  • 举报
回复
谢谢heartdevil(困兽),你说的[SoapRpcMethod(Use=System.Web.Services.Description.SoapBindingUse.Defalut)] 是不可行的,但是你说自己写soap表头,我就不懂了,能详细描述下,或介绍点资料...很感谢

我很急,请大家多顶顶.谢谢
junsir 2006-11-17
  • 打赏
  • 举报
回复
不懂 帮顶下
heartdevil 2006-11-17
  • 打赏
  • 举报
回复
[SoapRpcMethod(Use=System.Web.Services.Description.SoapBindingUse.Encoded)]
类型,使用给定的编码规则对消息部分进行编码。他不支持数组。如果你想使用数组作为传输参数,请采用[SoapRpcMethod(Use=System.Web.Services.Description.SoapBindingUse.Defalut)] 并自己写Sope表头。
Wrox红皮书系列中的Webservice 入门(具体名字我要回去看了才知道,我的书放家里了)。第5章里面有讲到这个方面,你对照这自己写表头。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧