调用java的webservice返回null
When you try invoke a Java/Axis Web Service from a proxy class generated by Visual Studio 2005 or Visual Studio 2008 you often crash against the ‘return null’ issue.
The web service seems to get called correctly and it responds to your client in the right way (you have no exception of any sort), but your returned object is null, it happened to me to face this situation today for the first time, there are a couple of things you can do to debug and resolve this situation:
- Let’s consider our function call:
1: [Test]
2: public void T1()
3: {
4: Test.TestWs ws = new
AxisWebService.Test.TestWs ();
5: Test.State[] arr =
ws.getStates(1);
6: Assert.IsNotNull(arr);
7: }
here we expect to have back an array of State objects,
instead we obtain the hated ‘null’.
- The
first thing to do is to download and install ‘Fiddler’ (do it right now if
you don’t have it already) and have a look at what the web service respond
to us (the snippet is a trimmed response):
1: HTTP/1.1 200
OK
2: Connection: close
3: Date: Wed, 15 Oct 2008
12:36:26 GMT
4: Server:
Microsoft-IIS/6.0
5: X-Powered-By:
ASP.NET
6: Content-Type:
text/xml;charset=utf-8
7:
8: <?xml
version="1.0" encoding="utf-8"?>
9: <soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
10: <soapenv:Body>
11: <getStatesResponse
xmlns="">
12: <item
xsi:type="ns1:State"
xmlns:ns1="http://mynamespace.it/">
13:
<Code>A001</Code>
14:
<Description>Test</Description>
15: </item>
16:
</getStatesResponse>
17:
</soapenv:Body>
18: </soapenv:Envelope>
Since the web service is responding correctly the
problem is in the deserialization stage of the data stream sent back by the web
service.
- It’s time to
show some hidden file of the solution and look inside the ‘reference.cs’
(this is the default file in which Visual Studio creates some proxy
classes).
Looking at the proxy classes generated by Visual
Studio, it seems that we have all that we need: a class to call the web service
and series of classes that map the objects the service returns; where’s the
problem then? it turns out that the web service client can’t understand the
response stream, so the problem is in a mismatch somewhere.
Given the fact we have all the classes and
all of them have the right properties, it’s time to look for the namespaces:
- Visual
Studio 2005
1:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://mynamespace.it/getStates",
2: Use = System.Web.Services.Description.SoapBindingUse.Literal,
3: ParameterStyle =
System.Web.Services.Protocols.SoapParameterStyle.Bare)]
4: [return:
System.Xml.Serialization.XmlArrayAttribute("getStatesResponse",
Namespace = "http://mynamespace.it/")]
5: [return:
System.Xml.Serialization.XmlArrayItemAttribute("item", Form =
System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)]
6: public Stato[]
getStates([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://mynamespace.it/")]
int getStatesRequest)
7: {
8: object[] results =
this.Invoke("getStates", new object[] {
9: getStatesRequest});
10: return ((State[])(results[0]));
11: }
pay attention to line number 4:
1: [return:
System.Xml.Serialization.XmlArrayAttribute("getStatesResponse",
Namespace = "http://mynamespace.it/")]
here it states that the getResponseState element is
qualified with the ‘http://mynamespace.it'/’ namespace...but look at what Fiddler captured for us
(line 11 of the previous snippet): there we see that the namespace associated
with the element is “” (empty string), so here it is our mismatch. To fix the
problem you have to manually edit the attribute and correct the namespace to “”
(empty string).
Be very careful: writing Namespace =
“” or removing it at all are two completely different things.
Having made this fix our test passes and we are able
to get our objects back from the web service.
- Visual
Studio 2008
It produces a completely different set of classes to
call the web service, we have an interface that describes the service, a
series of classes that represent the request and response of each method
exposed by the interface and finally we have the proxy classes for the
objects returned. We know that the problem is at the ‘client’ side so
checking the request classes is useless, we focus our attention on the
response classes and on object classes to verify the namespace
mappings:
1:
[System.Diagnostics.DebuggerStepThroughAttribute()]
2:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel",
"3.0.0.0")]
3:
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
4: public partial class
getStatesResponse {
5:
6:
[System.ServiceModel.MessageBodyMemberAttribute(Name="getStatesResponse",
Namespace="http://mynamespace.it/", Order=0)]
7:
[System.Xml.Serialization.XmlArrayItemAttribute("item",
Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
8: public State[]
getStatesResponse1;
9:
10: public getStatesResponse() {
11: }
12:
13: public getStatesResponse(State[]
getStatesResponse1) {
14: this.getStatesResponse1 =
getStatesResponse1;
15: }
16: }
look at line 6, you can see a namespace mismatch
again, the fix is the same applied before.
In the end, if you are using a
Java/Axis Web Service and you get null results from you service calls, don't
trust the auto-generated proxy classes too much and check that the attribute
that defines the namespace for each object match what you get from the wsdl and
from the traced response.
引用地址:<http://www.primordialcode.com/blog/post/invoking-javaaxis-web-service-net-return-null-issue>
调用java的webservice返回null的更多相关文章
- .NET调用JAVA的WebService方法
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料, ...
- Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)
相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...
- delphi7编写客户端调用java服务器端webservice示例
1. 首先取得java-webservice服务器端地址.我的是:http://localhost:8080/mywebservice/services/mywebservice?wsdl 2. 然后 ...
- Delphi动态调用Java的WebService 转
Delphi动态调用Java的WebService —— 基于“Axis2发布WebService例子(HelloWorld)” uses ComObj; var WsObject: Variant; ...
- C#调用Java的WebService添加SOAPHeader验证(2)
C#调用Java的WebService添加SOAPHeader验证 上一篇链接如上,更像是 Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) 来处理xml, ...
- C#调用Java的WebService添加SOAPHeader验证
C#调用Java的WebService添加SOAPHeader验证(2) 1.问题描述 调用的Java的webservice string Invoke(string func, string req ...
- c#调用JAVA的Webservice处理XML数据及批量轮询的实现方法
前段时间做一个调用外单位WEBSERVICE的项目,项目完成的功能其实很简单,就是我们单位有很多车友会员,我们想对他们提供车辆违章信息告之服务!我们这边交警部门给我们开放了WS的接口,我们就是想通过这 ...
- PHP调用JAVA的WebService简单实例
使用PHP调用JAVA语言开发的WebService.客户端提交两个String类型的参数,服务端返回一个对象类型.服务端使用AXIS-1.4作为SOAP引擎.客户端为PHP5.2.9,使用NuSOA ...
- C#调用Java的WebService出现500 服务器错误
最近在用C#调用Java写的WebService时,发现老是返回500 服务器错误,到底什么原因一直找不出来, 后来google了以后,找到国外的http://stackoverflow.com站点已 ...
随机推荐
- C#编程中的66个好习惯,你有多少个?(转)
http://www.cnblogs.com/jxsoft/archive/2012/01/11/2318824.html
- 【Hadoop学习】CDH5.2安装部署
[时间]2014年11月19日 [平台]Centos 6.5 [工具]scp [软件]jdk-7u67-linux-x64.rpm CDH5.2.0-hadoop2.5.0 [步骤] 1. 准备条件 ...
- 【Hadoop代码笔记】通过JobClient对Jobtracker的调用详细了解Hadoop RPC
Hadoop的各个服务间,客户端和服务间的交互采用RPC方式.关于这种机制介绍的资源很多,也不难理解,这里不做背景介绍.只是尝试从Jobclient向JobTracker提交作业这个最简单的客户端服务 ...
- leetcode@ [263/264] Ugly Numbers & Ugly Number II
https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugl ...
- HDU-4687 Boke and Tsukkomi 带花树,枚举
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4687 题意:给一个无向图,求所有的最大匹配的情况所不包含的边.. 数据比较小,直接枚举边.先求一次最大 ...
- sap 如何获取公司间采购订单或销售订单的交货状态
在上SAP项目过程,上了SD模块的企业一般都要做一些跟公司间采购订单或销售订单的交货状态的报表,通过这些报表可以经客户的业务上提供很大的灵活性,至于如何的灵活,还是那句老话“谁用谁知道".1 ...
- [OC Foundation框架 - 20] 统计代码行数
注意: 1.变量名和函数名不要混淆调用 2.不要对文件夹进行文件的操作,没有权限 3.递归调用注意初始化变量 // // main.m // CodeLineCount // // Created ...
- Block的引用循环问题 (ARC & non-ARC)
2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block.说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好 ...
- sublime Text 3的默认快捷键大全
Ctrl+M 光标跳至对应的括号 Alt+. 闭合当前标签 Ctrl+Shift+A 选择光标位置父标签对儿 Ctrl+Shift+[ 折叠代码 Ctrl+Shift+] 展开代码 Ctrl+KT 折 ...
- MySQL索引使用方法和性能优化
在自己的一个项目中,数据比较多,搜索也很频繁,这里找到一个建立索引很不错的文章,推荐下. 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的 ...