none
重发帖,以前的标题不够明显。。 wcf的契约居然连参数名称都作为识别依据。。。真太刺激了。。。 RRS feed

  • 问题

  • 在wcf的客户端代理proxy中有icontract接口和有它派生的contractclient类两个类型,wcf这样识别函数标示,icontract中声明的函数必须和派生类中的重载函数的--函数名、函数返回值、函数的参数个数、参数类型、参数位置、最不可思议的是连参数的名称都要求一致。

     

    我把参数名称不一致一把,结果传到服务端的参数永远为Null。

     

    偶得娘呀,这也太没天理啦。。。

    2008年3月14日 2:40

答案

  •  

    可以把参数的名称设置不一致 但要声明 如下:

     

       在声明契约时:

        [OperationContract]
    void SaveLink([MessageParameter(Name="LinkItem")] LinkItem item);

     

    这样参数的名称不是item 而是LinkItem

     

    同理方法的名称也可以变化

     

    [DataContract(Name="LinkItemname”)]
    public class LinkItem
    {…}

     

    方法名称改为LinkItemname

    2008年4月24日 3:09
  • 恩。CLR语言里面的类型名称与SOAP数据包中的类型名称可以不同,但是需要使用Name=""的方式来映射。程序需要保证SOAP数据包中的类型名称相同,否则Web Service之间或者客户端和服务器之间服务解析对方的SOAP数据包。而CLR语言中的名称可以不同,这要保证映射正确就可以了。
    2008年4月24日 6:31
    版主

全部回复

  •  

    可以把参数的名称设置不一致 但要声明 如下:

     

       在声明契约时:

        [OperationContract]
    void SaveLink([MessageParameter(Name="LinkItem")] LinkItem item);

     

    这样参数的名称不是item 而是LinkItem

     

    同理方法的名称也可以变化

     

    [DataContract(Name="LinkItemname”)]
    public class LinkItem
    {…}

     

    方法名称改为LinkItemname

    2008年4月24日 3:09
  • 恩。CLR语言里面的类型名称与SOAP数据包中的类型名称可以不同,但是需要使用Name=""的方式来映射。程序需要保证SOAP数据包中的类型名称相同,否则Web Service之间或者客户端和服务器之间服务解析对方的SOAP数据包。而CLR语言中的名称可以不同,这要保证映射正确就可以了。
    2008年4月24日 6:31
    版主