`
touchmm
  • 浏览: 1003185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

WebService 使用和调试小结

阅读更多

标题:WebService 使用和调试小结

作者:jrq

链接:http://blog.csdn.net/jrq/archive/2006/05/24/752174.aspx

内容:

对WebService的使用和调试做一下记录。备忘。

因使用JB2005+AXIS 发布WebService,总有一些奇奇怪怪的问题,故使用JB9。


(一)使用 JB9+AXIS 发布 WebService 服务


1.新建Project--Project,新建Web--Web Application;

2.新建Web Service--Web Services Configuration;

3.WebApp选择刚建立的Web Application的名字,其他默认;

4.建立WebService服务端的类(test.java)。

-----------------------------

public class test {
private static int a;
private static int b;

public test() {
}

public void setA(int x) {
this.a=x;
}

public void setB(int y) {
this.b=y;
}

public int getSum() {
int c=a+b;
//System.out.println("a:"+a);
//System.out.println("b:"+b);
//System.out.println("c:"+c);
return c;
}
}

-----------------------------

5.发布 WebService 服务

(1)右击要发布的类,选择“Export as a Web Service”;

(2)如果勾选了“Generate client stub”,则发布后同时生成客户端的类及接口测试类。可以不勾择此项;

(3)“Deploy scope”中可以选择该项为“Session”,其他默认;

(4)“Selection mode”中选择“Allow selected methods”,然后在“Methods in”中选中类要发布的接口方法。可多选。

(5)其他默认,点击“Finish”完成发布后,自动生成WSDL(Web Service Description Language)文件。

6.注意

类的属性使用了private static修饰符。如“private static int a”。

类的方法不能使用static修饰符,如“public int getSum()”,因为静态的类方法是不能发布为WebService接口的。

(二)使用 Delphi7 编写 WebService 的客户端

1.新建Project & Application;

2.New-Other-WebService-WSDL Importer,选择WebService服务的WSDL描述文件,也可选择WSDL文件的URL;

3.单击“Finish”按钮,生成WSDL文件对应*.pas单元文件;

其内容大致如下:

------------------------------------------------------
test = interface(IInvokable)
['{787CE852-EF00-40BA-5802-9BF9DFBF79F0}']
procedure setA(const a: Integer); stdcall;
procedure setB(const b: Integer); stdcall;
function getSum: Integer; stdcall;
end;

function Gettest(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): test;


implementation

function Gettest(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): test;
const
defWSDL = 'http://127.0.0.1:8088/test/services/test?wsdl';
defURL = 'http://127.0.0.1:8088/test/services/test';
defSvc = 'testService';
defPrt = 'test';
var
RIO: THTTPRIO;
begin
Result := nil;

if (Addr = '') then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;

if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;

try
Result := (RIO as test);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;


initialization
InvRegistry.RegisterInterface(TypeInfo(test), 'http://127.0.0.1:8088/test/services/test', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(test), '');

end.

------------------------------------------------------

4.建议:保存由WSDL文件生成的*.pas单元文件时要重命名(webtest.pas),最好不使用默认名字;

5.Delphi7编写的WebService客户端调用代码:

-----------------------------
uses webtest;

var atest: test; //test类
sum:Integer;
begin
atest:=Gettest(); //要uses wsdl对应*.pas单元文件。
atest.setA(1);
atest.setB(2);
sum:=atest.getSum();
ShowMessage(IntToStr(sum));
end;

-----------------------------

6.注意

如果服务端类的属性没有加static描述,则Delphi7编写的客户端使用setA()、setB()后再getSum()时不能得到正确的结果。

因为WebService是无连接的,每次使用类方法时均得到一个新的对象应用,setA()、setB()后再getSum()操作不是针对同一个对象的。

但加上static后,所有的对象共同使用类的同一个值。如此即可。


另外,如果在JB9+AXIS发布WebService时,“Deploy scope”中选择的是“Session”,而不是默认的“Request”,

在服务端类的属性即使不使用static约束,在Delphi的客户端使用setA()、setB()后再getSum(),也是可以得到正确的返回值。

神奇。^_^


7.建议

本例只做测试和解决问题。如果要给WebService服务端传递数据,最好在接口方法中使用参数。

如修改为getSum(int x,int y)后再发布接口,这个即可使用一个接口方法就可以完成操作,而不必先使用set方法传递参数数据。

(三)使用JB9编写 WebService 的客户端

1.新建Project--Project;

2.新建Web Service--Import a Web Service;

3.在WSDL URL中选择wsdl文件的URL,也可选择WebService服务的WSDL描述文件;

4.因为是建立WebService的客户端,所以“Generate server-side classes”选择可以不勾选;

5.在“Package options”中可以修改“Name”为合适的名字;

6.其余选择默认值,单击“Finish”生成客户端的jajva类文件。一般是6个文件,有其自己的命名规则。可参看JB。

7.JB9编写的WebService客户端测试类

-----------------------------

public class client {

public client() {
}

public static void main(String[] args) {
try {
TestService service = new TestServiceLocator();
Test aClient = service.gettest();
aClient.setA(1);
aClient.setB(2);
int sum = aClient.getSum();
System.out.println("Sum is:"+sum);
}
catch (Exception e) {
System.err.println("Execution failed. Exception: " + e);
}
}

-----------------------------

8.注意

如果服务端类的属性没有加static描述,则JB编写的客户端使用setA()、setB()后再getSum()时亦不能得到正确的结果。

建议使用带参数的接口方法来传递参数数据。避免使用set方法。


(四)使用Delphi7调用C#编写的WebService服务

Delphi7编写的客户端调用C#编写的WebService服务时,如果函数中传递的参数为汉字时,可能出现乱码现象。

在网上搜索了一些资料,找到解决办法:将HTTPRIO的UseUTF8InHeader属性改为true即可。

即编辑由WSDL文件生成的*.pas单元文件,在Get函数中增加一句:RIO.HTTPWebNode.UseUTF8InHeader:=True。

代码片断大致如下:

------------------

try
RIO.HTTPWebNode.UseUTF8InHeader:=True; //添加一句,修改编码方案。
Result := (RIO as test);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;

----------------


[--完--]

by jrq

2006/05/24 凌晨 于穗

分享到:
评论

相关推荐

    WebService接口开发实战总结

    WebService接口开发实战总结以及调试。

    java 调用webservice的各种方法总结

    一、利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务 1.首先建立一个Web services EndPoint: Java代码 package Hello; import javax.jws.WebService; import javax.jws.WebMethod; import ...

    vc6.0调用webservice的方法

    本代码介绍了vc6.0如何调用webservice的详细步骤,是通过自己的调试成功 总结下来的

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 理解基元类型、值类型和引用类型的行为,从而最高效地定义和使用它们 · 使用泛型和接口来定义可重用的算法 · 高效使用特定的CLR类型——委托、枚举、定制attribute、数组和字符串 · 理解垃圾回收器是如何管理...

    ASP.NET应用与开发案例教程

    上篇ASP.NET应用与开发基础 第1章ASP.NET概论 1.1ASP.NET简介 1.1.1从.NET谈起 1.1.2动态网站设计技术 1.1.3ASP.NET的介绍 1.1.4ASP.NET和ASP的对比 1.2运行环境配置 1.2.1ASP.NET运行环境介绍 ...12.4小结

    ASP.net技术内幕

    10.3.1 创建单页面的主/明细表单 10.3.2 创建多页面的主/明细表单 10.4 小结 <br/>第11章 使用DataList和DataGrid控件 <br/>11.1 DataList和DataGrid控件概述 11.1.1 理解事件冒泡...

    asp.net技术内幕(1)

    18.4 使用调试器 18.4.1 连接调试器 18.4.2 建立断点 18.4.3 建立观察 18.4.4 逐步执行ASP.NET页面 18.5 小结 <br>第五部分 保护ASP.NET应用程序 <br>第19章 使用基于表单的身份验证...

    asp.net技术内幕(2)

    18.4 使用调试器 18.4.1 连接调试器 18.4.2 建立断点 18.4.3 建立观察 18.4.4 逐步执行ASP.NET页面 18.5 小结 <br>第五部分 保护ASP.NET应用程序 <br>第19章 使用基于表单的身份验证...

    asp.net技术内幕(5)

    18.4 使用调试器 18.4.1 连接调试器 18.4.2 建立断点 18.4.3 建立观察 18.4.4 逐步执行ASP.NET页面 18.5 小结 <br>第五部分 保护ASP.NET应用程序 <br>第19章 使用基于表单的身份验证...

    asp.net技术内幕(4)

    18.4 使用调试器 18.4.1 连接调试器 18.4.2 建立断点 18.4.3 建立观察 18.4.4 逐步执行ASP.NET页面 18.5 小结 <br>第五部分 保护ASP.NET应用程序 <br>第19章 使用基于表单的身份验证...

    asp.net技术内幕(3)

    18.4 使用调试器 18.4.1 连接调试器 18.4.2 建立断点 18.4.3 建立观察 18.4.4 逐步执行ASP.NET页面 18.5 小结 <br>第五部分 保护ASP.NET应用程序 <br>第19章 使用基于表单的身份验证...

    ASP.NET2.0高级编程(第4版)1/6

    1.5 小结17 第2章 Visual Studio 200519 2.1 启动页面19 2.2 文档窗口20 2.2.1 文档窗口中的视图20 2.2.2 标记导航器21 2.2.3 页面标签22 2.2.4 代码改变状态的通知23 2.2.5 错误通知和辅助23 2.3 工具箱25 2.4 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    1.5 小结 17 第2章 Visual Studio 2005 19 2.1 启动页面 19 2.2 文档窗口 20 2.2.1 文档窗口中的视图 20 2.2.2 标记导航器 21 .2.2.3 页面标签 22 2.2.4 代码改变状态的通知 23 2.2.5 错误通知和辅助 23 ...

    ASP.NET Night Words

    21.3.1 禁用调试模式 420 21.3.2 合理使用viewstate 420 21.3.3 合理选择会话状态数据 21.3.3 存储模式 423 21.4 总结 424 第22章 综合实例 425 22.1 项目介绍 425 22.2 数据库设计 426 22.3 实体层设计 429...

    Visual C#网络编程技术与实践源代码

    Visual Studio支持Visual C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NET Framework类库,可以访问多种操作系统服务和其他有用的精心设计...

    asp.net知识库

    C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件...

    JavaScript高级教程

    1.3 小结..............................................8 第 2 章 ECMAScript 基础...............................................9 2.1 语法..............................................9 2.2 变量...........

Global site tag (gtag.js) - Google Analytics