也谈“指定的 SOAPAction 无效”异常的解决办法 ”

    之前调试Remoting程序时有碰到“指定的 SOAPAction 无效”的问题,即客户端调用远程remoting方法时,提示SOAPAction 无效,一时不知道怎么解决。在网上百度下,看到一篇文章“Remoting在HttpChannel下抛“指定的 SOAPAction 无效”异常的解决办法 ”, 按照该文章的说法,只需要把客户端的程序集名称和命名空间改成与服务端的一样就可以了。

    按照文章提到这种做法,试了下,果然可以调用。不过问题来了,如果都这样的话,调用客户一多,难不成客户端都要改成一样的程序集名一样的命名空间?其实这样的方法是治标不治本,没有找到问题真正所在。 我仔细看下了remoting服务端生成的soap(rem)格式的xml服务文件,里面方法节点对应的namespace和SoapAction都是根据程序集名称和命名空间组成,类似"soapAction="http://schemas.microsoft.com/clr/nsassem/TestShrek.RemoteObject/TomLib#get_StartTime" ,其中 TestShrek.RemoteObject是类名(带命名空间), TomLib是程序集名称,get_StartTimeStartTime(属性)是调用的方法名。  而在客户端调用时也是按照客户端程序集和命名空间以及方法来调用。这样一来客户端和服务端生成调用就可能不一样了。

  解决的办法其实很简单的,就是给相应的服务方法(上面提到的StartTime)加上SoapMethod特性,并指定NameSpace和SoapAction。这个指定必须在服务端和客户端的服务类(接口)中同时指定,而且要一样。如下:   

 interface iRemoteObject  //客户端
    {
        int Count();
        int Add(int i);
        DateTime StartTime { get; }
        string Status { get; }
        string IsProcessing { get; }
        [SoapMethod(XmlNamespace = "TomasX", SoapAction = "TomasX#Greeting")]
        string Greeting(string name);
    }
 
服务端

 [SoapMethod(XmlNamespace = "TomasX", SoapAction = "TomasX#Greeting")]
        public string Greeting(string name)
        {
            GYF.WriteLog(name+"\t test", "");
            return "Hello," + name;
        }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值