求助,关于webservice调用方式客户端调用的奇怪问题

webservice五种发布方式及客户端调用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
webservice五种发布方式及客户端调用
&&weblogic接口实现方式,五种实现方式
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩20页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢webservice 客户端调用服务端出现401错误 - CSDN博客
webservice 客户端调用服务端出现401错误
原因是服务端做了用户名和密码验证,但是客户端调用时未传递,所以需要调用接口前,把用户名和密码也一块传递过去。
&& URL url = new URL(&&);
&&&&&&&XXXStub stub = new XXXStub(url,null);
&&&&&&& stub.setUsername(&admin&);
&&&&&&& stub.setPassword(&12345&);
一般stub代码中都有设置用户名和密码的方法的。
A 401 error means that the target URL is protected, and you need to provide username/password authentication.
you need to set the username and password in the client, or tune your server settings so that the service is not protected.
Check the TemperatureConverterStub class for methods that allow you to set username/password, or check the documentation of whichever tool you're using to create those classes for more information on this.
本文已收录于以下专栏:
相关文章推荐
在使axis调用webservice服务端,参照网上给的demo:
Call call = (Call) service.createCall();
call.setTargetEndpointAdd...
图形化配置axis2 的demo 请参考  /article/ea992b845eaf98.html
下边是比较繁琐的自行配制:
我的项目环境:eclipse 、SSH框架
最近在学习webserivce在java的使用,做了一个小例子。
1、我的项目结构
     
项目名:InterfaceConto...
用AXIS2发布WebService的方法。axis2+web+tomcat1
两种方法:
一,使用jdk自带工具根据服务器地址,生成服务实体类接口
1,eclipse中新建一个项目,
2,使用jdk自带wsimport工具自动生成服务端java代码,打开dos窗口,输入
前几天一直在寻找lia
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2014年7月 Java大版内专家分月排行榜第二
2015年1月 Java大版内专家分月排行榜第三2014年8月 Java大版内专家分月排行榜第三
2014年7月 Java大版内专家分月排行榜第二
2015年1月 Java大版内专家分月排行榜第三2014年8月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。为什么webservice客户端调用,拒绝连接
Exception in thread &main& AxisFault faultCode: { faultSubcode:
faultString: java.net.ConnectException: Connection refused: connect faultActor:
faultNode:
faultDetail:
{: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
09-12-09 &匿名提问
这是我写的个简单的两数求和的webservice客户端,jar包生成以后。写了一个java类。&/p&&public static void main(String[] args) throws ServiceException,&br&&&&RemoteException {&br&&&int i = 20;&br&&&int j = 20;&br&&&CalculateService cs = new CalculateService_Impl();&br&&&Calculate cal = cs.getCalculateSoapPort();&br&&&int sum = cal.sum(i, j);&br&&&System.out.println(i + &+& + j + &=& + sum);&br&&}}你可以查看那个jar包,里面有调用服务的接口。看看就明白了。&/p&
请登录后再发表评论!关于动态引用WEB SERVICE的问题
我的图书馆
关于动态引用WEB SERVICE的问题
关于动态引用WEB SERVICE的问题!
首先我有多个WEB SERVICE,他们的功用我是知道的,同时也知道它们的具体位置(URL地址)。但是对于什么时候调用它,什么时候调用那一个WEB SERVICE只有运行时才能确定。这就意味着我不能简单的用“添加WEB引用”(在VISUAL STUTIO.NET中)这样的方式实现,而需要我写一个WEB SERVICE,通过传入参数(指定URL地址)在运行时调用。我想这样的需求现实中是肯定存在的。
我所能想到的一个办法是先建立一个WEB SERVICE代理类实例,然后更改其URL属性从而“动态调用”。但是这就要求我要先引用一个实际存在的WEB SERVICE(难道要我自己写一个?),我考虑的是是否有更好的办法解决这个问题。
是否是我先写一个WEB SERVICE,它只是一个虚拟类(但是虚拟类又不能创建实例)。
或者有点类似VB里面,我们可以用静态引用一个DLL的方法(project--&reference)但是也可以用createObject的方法在运行时创建一个对象。
1楼:关注 2楼:如同OO语言中的interface,WebService的接口是WSDL,在有WSDL定义的情况下,.NET的辅助工具就可以生成相关调用的Proxy供运行时使用,这与具体WebService的实现代码无关。
而生成WSDL所必需的是: 1) Webservice的URL地址(这个在运行时仍然可以改变);2) 与WebService调用相关的方法名称,以及方法的参数/返回值定义。
事实上如果有以上信息你甚至可以手工的书写一个WSDL文档,也就不需要有现成的WebService了,但是那恐怕并不容易:).
所以我的建议是:
1. 先根据已知的WebService调用信息(参数/返回类型,URL),写一个FakeWebService,不需要实现任何方法代码,只是写上调用的基本形式/名称,例如:
[WebMethod]
MyReturn MyMethod(MyParam param) {
return new MyReturn();
2. 使用VS.NET的Add Web Reference或者Wsdl.exe生成相应的proxy代码,这个proxy只是限定了调用的方法的signature, URL仍然可以在运行是制定。
3. 在运行时使用这个proxy的实例+制定的URL调用真实的WebService。
4. 如果有兴趣研究WSDL的话,也可以尝试不是用fakeWebService+WSDL.exe,自己手工书写WSDL文档:)。
3楼:感谢qqchen79(知秋一叶) 的回复,你的意见和我最初的思路很接近,但是比我的要明确些,写个虚拟类是行不通的,但是接口就没有问题了,应该说这个办法虽然还不太完美,也可以基本解决问题了。但是我想这个问题微软不应该没有考虑到才对,那么是否还有更好的办法呢?!
我期待更好的答案。但是不管怎么样,都非常感谢qqchen79(知秋一叶) ,也欢迎更多的朋友加入讨论。 4楼:"URL仍然可以在运行是制定",请问如何在运行时指定URL?我觉得问题归根结蒂就是这个? 5楼:首先可以肯定,编写一个通过reflection机制完全动态生成webservice proxy的程序并不困难。但问题这样的类有什么具体应用?WebService是主要针对B2B应用的,或者说它提供的服务应该是相对稳定的。在这种情况下至少在WSDL这一层上不应该频繁的变化而导致必须生成新的代理。
所以,针对你的情况,通过WSDL静态产生代理的方式已经足够了,之所以要写一个fakeWebService,是因为Vs.net工具使得程序员的能力退化,你我不需要了解WebService底层的细节,要我们写出一个正确完整的WSDL还不如写一个webservice接口让wsdl.exe来完成其它工作来的省力。 6楼:如果你知道你的webservice在哪里,就可以先生成一个proxy(有可能不用成成,就可以直接调用的),在proxy类里面修改构造函数,加入参数string url,动态生成时,就可以指定url了,不知道是不是这个意思 7楼:学习!
qqchen,我要向你学习web service技术! 8楼:有可能不用成成,就可以直接调用的?
猜测性的我想最好还是别说出来:) 9楼:这个问题悬了这么久还没有结帖,我自己都有点不好意思了,所以,如果再等两天没有更好的答案,我就把帖子结了,不过这个问题。。。。 10楼:首先我有多个WEB SERVICE,他们的功用我是知道的,
我觉得你这话说的有点不清楚,关于“知道功用”是指事先就得到了wsdl?还是只知道ws大致的用途,具体的wsdl得在运行的时候才能根据url去取?
如果是后者可以用你得程序去调用wsdl。exe获得proxy的cs文件,编译,load assembly,后帮定调用方法。不过这样速度会比较差吧~ 11楼:用JScript.Net或者VB.Net吧。。
如果有SoapToolKit那就用SoapToolKit绑定好了。
如果没有,用我的:
/lostinet-Publish/JScriptSoapClient/
不过没有转成.Net版哦。。。。。
外面套个class就能用了。
VB.Net也可以用啊。。 12楼:URL都待定?那你知道那个service是否就是你要的那个? 13楼:不好意思,51大假休息去了,没有怎么上来看,看到这么多朋友回复真是高兴,又有人关注了。首先声明一点对于“qqchen79(知秋一叶) ”的帮助表示感谢,并且用菲薄的50分作为回报。同时对本问题进行加分,对下面有启发性的讨论都给分,不为别的,只希望大家都能共同进步!:)
14楼:to ripper(rIPPER):
我觉得你这话说的有点不清楚,关于“知道功用”是指事先就得到了wsdl?还是只知道ws大致的用途,具体的wsdl得在运行的时候才能根据url去取?
首先“知道功用”这个说法我考虑了下,对这个问题并没有帮助,反而让大家想入歧途去了。简单点说吧:我想在运行时发现一个WSDL并且生成PROXY。这就好象这样一个函数:
function msg(str)
msgbox str
end function
不同的在于,我的传入参数是一个WSDL的URL地址,在函数内部也不只是msgbox一条信息那么简单。我将根据这个URL参数,在程序运行时去发现一个WSDL,并生成一个PROXY。OK,就这么简单,还有不明白的吗?!
顺便说一句,本帖已经加了50分,如果不够,还会再加。分是小事,大家共同进步才有意思! 15楼:到
/lostinet-Publish/JScriptSoapClient/
看过没有啊?
我也是事前不知道的啊。
不过是用JSCRIPT来做的。。。。
-------------------------------
实际上,用。NET来做这个,
不是方便的事情。(不过比J2EE已经方便不知道多少倍了)
正如qqchen79(知秋一叶)所说,
你必须用System.Reflection来实现你的要求。
但是,我看。你是没有可能那么麻烦还要实时调用你那时创建的类的。
(除非约定好那个WEBSERVICE的形式,就象COM的机制一样)
最大的用途,可能是使用VB。NET或者JSCRIPT。NET的晚期绑定。
所以你还要用System.Runtime.InteropServices来实现晚期绑定。
不过做这个实在不明智。 16楼:在程序执行过程中实现动态绑定,我只知道可以使用MS SOAP ToolKits提供的COM对象动态生成,其他的就不知道了。
因为对.net的web service实现不熟,目前我只了解Borland的VCL实现机制。 17楼:to lostinet() :
/lostinet-Publish/JScriptSoapClient/该页无法显示。
18楼:照你后来的说明这样的方法应该是可以的,也许还有更加方便的办法
用你得程序去调用wsdl。exe获得proxy的cs文件,编译生成assembly,load assembly,后帮定调用方法 19楼:其他人来不来看,我没有所谓。
不过我还真建议你看看。
或者到网吧去看吧。
原代码在这里:
你可以忽略Delegate那部分的。
JScriptSoapClient那个函数。
http://www.csdn.net/Develop/article/13/13635.shtm 20楼:我看了下CreateSoapClient这个函数有点苗头,我下来仔细看看,如果真的是,那可真要好好感谢你了!
var CurrentSoapClient=new Object();
CurrentSoapClient.CollWebServiceInfo=CreateDefaultCollection();
CurrentSoapClient.URL=
CurrentSoapClient.UserName=
CurrentSoapClient.Password=
21楼:我粗略看了下。好象你是用JSCRIPT脚本来实现的,思路好象是先用XMLHTTP对象把WSDL描述下载到本地,然后用XMLDOM进行解析,得出WEBSERVICE?
不得不佩服你的想法,但是这样对我来说好象有点什么来着,舍本逐末?我现在已经在.NET环境下了,应该说在获取WSDL以及取得它的WEBSERVICE描述.NET已经做的很好了,这些底层的东西我可以不去理会的。
其实我希望的就是在VB.NET中达到类似你下面这段代码的效果:
var wsdl=new JScriptSoapClient("/webservice.asmx?WSDL");
或者说,类似于你自己写的JScriptSoapClient对象在VB.NET里面有没有? 22楼:当然可以用JScript.Net来做,然后给VB.Net引用。
但是怎样把JScript.Net做成库,我不太清楚哦。
有人说用jsc把脚本编译成dll然后引用,
不过我没有试过。
--------------------
而且我写那个是因为,
客户端SoapToolKit一般都不安装的。更不要说。NET
所以要自己用脚本来做。
所以这个是客户端应用。
最主要还是用。NET开发WEBSERVICE,然后在IE里面引用。 23楼:/china/msdn/library/dv_vstechart/html/vbtchRedirectingApplicationToTargetDifferentXMLWebServiceDuringInstallation.asp 24楼:各位,幫小弟一下,我怎么樣用VC.NET調用Webserivice? 25楼:学习
26楼:学习中^^^^ 27楼:to 知秋一叶:
你好,我正在做动态引用web service的程序,我看了你的,很有帮助,但是你能不能简单做个样本,用你的第一种方式frakewebservice !谢谢! 28楼:运行时如何改变Web服务的位置
在开发web服务的客户端软件时,我们通常通过指定.asmx文件的URL在web服务中添加一个web引用地址。在VS.NET中添加web服务会生成必要的代理对象。然而,经常会有这样的情况出现,在添加web引用地址后,web服务又移到了其他地方。在这种情况下,最简单的自理方法是重新创建代理对象。但如果是已经部署了web服务的客户端软件,又发生了这种情况,那么使URL成为可配置的就是一种比较好的方式了,这样,即使原来的web服务发生了移动,客户端软件也无需重新编译。在本篇文章中,我们将讨论这一问题。
创建web服务
为了配合我们的讨论,我们将创建只有一个方法的简单web服务。按下面的步骤创建该web服务:
在VS.NET中创建一个新的C# web服务工程。
打开缺省的.asmx文件,并在其中添加下面的代码:
using System.Web.S
namespace HelloWorldWS
public class CHelloWorld :
System.Web.Services.WebService
[WebMethod]
public string GetHelloWorld()
return "Hello World From CHelloWorld";
如上所述,该web服务类(CHelloWorld)中只包含有一个被称作GetHelloWorld()的方法,它返回一个字符串。
在工程中添加另一个.asmx文件。
打开该文件,并将它修改成下面的形式:
using System.Web.S
namespace HelloWorldWS
public class CHelloWorldBackup :
System.Web.Services.WebService
[WebMethod]
public string GetHelloWorld()
return "Hello World From CHelloWorldBackup";
该类与上一个类相似,只是名字成了CHelloWorldBackup。另外它返回的字符串与GetHelloWorld()也不同,因此能够识别方法调用。
至此,我们就开发好了二个web服务,并编译该工程。
创建web服务客户端应用程序
下面为我们的web服务创建一个简单的web客户端软件。
在VS.NET中创建一个新的ASP.NET web应用程序。
该应用程序将有一个缺省的web表单。在我们添加在web服务中添加引用所需要的代码前,右击应用节点,选择“添加web引用”,这一点与在开发正常的web服务时相同。添加web引用将会生成代理web服务对象的代码。
在web表单上添加一个按钮,并在该按钮的Click事件中添加下面的代码:
private void Button1_Click
(object sender, System.EventArgs e)
localhost.CHelloWorld proxy=new localhost.CHelloW
Response.Write(proxy.GetHelloWorld());
上面的代码显示了在正常情况下我们如何调用web服务,web引用中包含着与web服务位置有关的信息。
在部署该客户端软件后,如果再改变了.asmx文件,就会发生错误。要避免发生这种情况,需要将上面的代码修改成如下所示的代码:
private void Button1_Click
(object sender, System.EventArgs e)
localhost.CHelloWorld proxy=new localhost.CHelloW
proxy.Url="http://localhost/webserviceurlandtimeout/HelloWorld.asmx";
Response.Write(proxy.GetHelloWorld());
在上面的代码中,我们将代理类的Url属性设置为要求的.asmx文件。我们可以将该URL存储在web.config文件的小节,在运行时再来访问它。如果改变了web服务,我们只要修改web.config中的这个URL即可。
下面是实现上述目的的代码:
private void Button1_Click(object sender, System.EventArgs e)
localhost.CHelloWorld proxy=new localhost.CHelloW
proxy.Url=GetURL();
Response.Write(proxy.GetHelloWorld());
public string GetURL()
return ConfigurationSettings.AppSettings["webserviceurl"];
在本例中我们的web.config如下所示:
&appSettings&
key="webserviceurl"
value="http://localhost/webserviceurlandtimeout
/HelloWorldBackup.asmx" /&
&/appSettings&
需要注意的是,要使上面的代码能够正确地运行,web服务和web方法的输入参数必须相同。
29楼:非常感谢各位的回复,我已经DOWN下来了,让我慢慢看看。
这端时间工作太忙了,已经连续好几天没有上网,连充电的时间都不怎么有了!招呼不周,大家见谅!:) 30楼:我觉得可以做一个解析wsdl的parser,获取接口,其中Binding的部分和Message部分似乎可以忽略,然后通过一个Soap包调用。
我的构思如下:
解析一个wsdl,首先用WebRequest获取一个wsdl,比如说: localhost/scope/webservice/member.asmx?wsdl
然后用xml的parser将下面的内容解析出来
&s:element name="Login"&
&s:complexType&
&s:sequence&
&s:element minOccurs="1" maxOccurs="1" name="username" nillable="true" type="s:string" /&
&s:element minOccurs="1" maxOccurs="1" name="password" nillable="true" type="s:string" /&
&s:element minOccurs="1" maxOccurs="1" name="Type" type="s:int" /&
&/s:sequence&
&/s:complexType&
&/s:element&
&s:element name="LoginResponse"&
&s:complexType&
&s:sequence&
&s:element minOccurs="1" maxOccurs="1" name="MemId" type="s:int" /&
&s:element minOccurs="1" maxOccurs="1" name="AdditionId" type="s:long" /&
&/s:sequence&
&/s:complexType&
&/s:element&
我们得到,调用入口是Login(string username,string password,int type)
返回值是(int MemId, int AdditionId)
然后我们可以用C#为其生成一个调用的soap包。
最后生成一个调用页面——用户可以输入参数,得到返回值。
不过这样做有些局限性,我们没有处理wsdl中的Message和Binding信息,如果对方wsdl绑定的不是soap协议,那么就会出错。 31楼:对不起,最近实在太累,每天从早上9点上到晚上10点,没有时间看书,没有时间上网,也没有时间上CSDN。太不好意思了,今天抽点时间来把帖子结了,感谢各位的踊跃参与和帮助,谢谢!
馆藏&23681
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 java 调用webservice 的文章

 

随机推荐