首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

==等待高手:c#调用java 写的webservice有关问题==

2013-11-12 
等待高手:c#调用java 写的webservice问题调用的webservice是java开发的,在c#中的调用代码如下,webserv

==等待高手:c#调用java 写的webservice问题==
调用的webservice是java开发的,在c#中的调用代码如下,webservice能正确执行,但是返回的参数(为自定义类型)一直为null,但是用java调用则能正确返回参数,测试其它还发现,如果返回类型string、int等不是自定义类型,C#都能正确返回,就是自定义类型的无法返回,一直为null,这几天在网上找了很多资料,总结了一下,都说有两种原因:
一:JAVA返回的XML不标准,C#这边反序列化的时候出问题
二:JAVA的SERVICE类跟返回的自定义对象的类放在两个不同的包,而C#这边生成的类两者是放在同一个命名空间的,所以C#这边会出问题。

对方是产品,不能随意修改了,不知道还有什么办法解决

WebReference.SyncNotifySPServiceImplService sss = new        WebReference.SyncNotifySPServiceImplService();//接口函数
   WebReference.SubInfo sbi = new WebReference.SubInfo();//提交参数
   WebReference.ResponseMessage rsm = new WebReference.ResponseMessage();//返回参数
   //-----------------提交的参数---------------------------
   sbi.userId = "654377";
   sbi.nsrsbh = "480101198510100991";
   sbi.zh = "480101198510100991_0@dlgs";
   sbi.fjxh = "0";
   sbi.yhmc = "测试用户";
   sbi.mm = "100991";
   sbi.sfzh = "10000001";
   sbi.sfje = "0.00";
   sbi.khrq = "2013-10-30";
   sbi.yxqz = "2013-10-30";
   sbi.dlszh = "";
   sbi.zt = "01";
   sbi.updateTime = "2013-10-30";
   sbi.sssf = "48";
   sbi.gds_bz = "01";
   sbi.kzcs = "";
   
   //-----------------提交的参数---------------------------
   rsm = sss.handleVpdn(sbi);//调用接口函数,返回自定义参数,一直为null


 
[解决办法]
C#这边,自定义类型是VS帮你自动包装的么?

跟进去调试下。
[解决办法]
都说XML是国际标准文本交换语言,就现在java和C#生成的xml标准不一样,确实是这样.你是C#调用java服务遇到这个问题,而我们是java调用C#服务遇到这个问题,我会继续关注你的问题.

就是因为两边的xml格式不一,就出现了系列化和反系列化的问题.
[解决办法]
暂且不讨论发生这个问题的原因是什么。很可能是你的java端的webservice的问题。没有生成C#端能够正常识别的xml。xml是通用的格式,如果对象不能识别,而可以识别string、int等。是否可以考虑不直接序列化对象,而是用json字符串(string)来交互数据呢?
[解决办法]
应该可以啊。
[解决办法]
如果确实是xml引起的,你可以不使用vs的xml读取类,自己通过最基本的xml读取方法解析xml文件好了。
[解决办法]
引用:
如果确实是xml引起的,你可以不使用vs的xml读取类,自己通过最基本的xml读取方法解析xml文件好了。


楼上说的有道理
[解决办法]
在方法头部加入如下标记

[SoapRpcMethod(Use = SoapBindingUse.Literal, Action = "http://tempuri.org/findUser", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
        [WebMethod]
        /// <summary>
        /// 单个从帐号查询接口
        /// </summary>
        /// <param name="userID">从帐号ID</param>
        /// <returns>从帐号信息</returns>
        public string findUser(string userID)
        {
            log.Fatal("系统开始访问--根据操作员账号查找账号信息");
            log.Fatal("系统开始访问--根据操作员账号查找账号信息XML:" + userID);
            var result = string.Empty;
            result = bo.FindUser(userID);
            return result;
        }

[解决办法]
不是用的实体类么
[解决办法]
Specified字段惹的祸
两种办法:
1.删掉C#这边生成的代理类中,额外增加的以Specified结尾的字段
2.传对象时,将那些字段全部置为true(可以用反射)
http://msdn.microsoft.com/zh-cn/library/system.xml.xmlattribute.specified(VS.80).aspx
[解决办法]
引用:
Quote: 引用:

Specified字段惹的祸
两种办法:
1.删掉C#这边生成的代理类中,额外增加的以Specified结尾的字段
2.传对象时,将那些字段全部置为true(可以用反射)
http://msdn.microsoft.com/zh-cn/library/system.xml.xmlattribute.specified(VS.80).aspx

能具体一点吗?Specified是在哪里的呢



C#调用有的java写webservice,通过C#生成代理类文件时,有的数据类在解析的时候会多出一个和数据类字段名称+Specified的字段,需要你给这个字段赋值才行,不然调用就会有问题。


例如:返回的结果类为class1,有字段field1,有的字段(例如:decimal类型的字段)就会生成一个field1Specified的字段,这个字段一般是bool类的且field1相关的,需要你赋值。这样才能正确调用java webservcie。



不管是给java webservice传数据,还是从java取数据都要解析这个字段的。

热点排行