Web服务(Web Service)

之前在网上找的一些文章,现在也忘了出处,现想放此以备不时之需,在此感谢原创! 

    今天是我第一次学习使用.Net编写WebService程序。当然得从最简单的Hello World开始了。

1.创建一个文本文件HelloWorld.asmx(.ASP.NET 使用 .asmx 文件提供 XML Web services 支持。)

using System;
using System.Web.Services;
public class HelloWorld : WebService
{
     [WebMethod]
     public String SayHelloWorld()
     {
          return "Hello World";
     }
}
2.将HelloWorld.asmx放在IIS工作目录下,现在我们可以通过http://localhost/helloworld.asmx访问它了.
这时候我们可以注意到提示:
此 Web 服务使用 http://tempuri.org/ 作为它的默认命名空间。建议:在使 XML Web service 公开之前,请更改默认命名空间。
 所以我们在HelloWorld.asmx中加入[WebService(Namespace="http://xcolor.cn/webservices/")]
 再次访问http://localhost/helloworld.asmx,建议没有了,一切正常。
 
3.为了在Visual C#中使用这个WebService服务,我们需要使用有一个 Web 服务描述语言工具 (WSDL.exe)。
此命令行工具用于从 WSDL 创建 代理类。我们输入: wsdl http://localhost/helloworld.asmx?wsdl 以生成
HelloWorld.cs文件,该文件包含了对该服务的调用。
 
4.为了试验如何在Visual C#中调用HelloWorld服务,我们新建一个空白的C#应用程序。
   在解决方案资源管理器中添加HelloWorld.cs文件。然后编写如下代码调用:
   HelloWorld myHelloWorld = new HelloWorld();      this.Text  = myHelloWorld.SayHelloWorld();
   编译,我们等待着HelloWorld的出现,可是遗憾的是。编译器告诉我们System.web.Service未引用。于是我们加入对
System.web.service.dll的引用,果然我们期待的HelloWorld出现了。

在Visual C#中的调用是成功了,我们还想试试,在其他开发环境下,效果怎么样了。
下面我使用Delphi来调用刚才的WebService服务。
1.新建一个空白的窗体工程
2.New ->Other->WebServices->WSDL Importer,
  在Wsdl Source 中输入 “http://localhost/helloworld.asmx?wsdl”
  生成HelloWorld.pas ,其中包含一个HelloWorldSoap接口和GetHelloWorldSoap函数
3.使用如下代码调用
procedure TForm1.Button1Click(Sender: TObject);var hello:HelloWorldSoap ;begin  hello:=GetHelloWorldSoap;  Caption:=hello.SayHelloWorld ;
end;
成功了,一切都是如此的简单和方便,我们真该为这个伟大的技术欢呼!

 

.NET 怎样调用WebServices 
最近的项目中需要调用WebServices,在网上找了很多资料,在这里对调用WebServics的方法总结一下。
无论那种客户端类型,调用WebServices的步骤都是十分类似的:

1、   获得WebServices的代理类;

2、   在客户端的代码中引用代理类;

3、   在客户端的代码中创建代理类的实例;

4、   通过调用代理类实例的方法来调用相应的WebServices服务接口方法。

 

一、 获得代理类

获得代理类的方法有两种:

1、   通过在Visual Stadio .NET2003中引用已有的WebService;

2、   通过.NET Framerwork SDK提供的wsdl.exe生成代理类。

方法一:

在VS2003中,可以使用Web引用的功能来创建代理类。

启动一个项目,在解决方案资源管理器里用右键选择Web引用。接下来输入WSDL文档的位置,或者输入一个Web URL,这个URL能够识别或发现链接到XML WebServices的页面或文档,在使用适当的链接来进行浏览。

方法二:

.NET Framework SDK中提供了一个命令行工具wsdl.exe,来获取WebServices的WSDL语言描述、XSD Schema或disco镜像文件生成该WebServics的代理类源代码。

在c:programe filesmicrosoft.net rameworkSDKin或者(C:Program FilesMicrosoft Visual Studio .NET 2003SDKv1.1Bin)下面可以找到这个工具。

具体语法:

Wsdl /language:language /protocol:protocol /namespace:namespace /out:filename / username:username /password:password /domain:domain(url or path)

参数说明:

Language:   是指代理使用的语言。因为不会直接修改代理类代码,所以使用什么语言并不重要(在重新生成这个类以后,所有的修改都会丢失)。默认的与语言为C#

Protocol:     通常会忽略这个选项而使用默认选项(SOAP)。但是也可以为较多限制的协议指定HTTP GET或HTTP POST

Namespace:    代理类使用的.Net命名空间。如果忽略这个参数,就没有命名空间了,而且该文件中的所有类将供全局使用。为了更好的组织结构,应该选用逻辑命名空间。Visual Studio.Net自动使用服务器名(例如:localhost)作为命名空间。

Out:        这使您能够指定所生成的文件名字。但这个名字被默认为服务名加上表示语言的扩展名。

Username/Password/Domain: 如果想通过WebServices访问虚拟目录,应该确定这些验证字段所需要的值。

Url或路径:这个字段总是加在WSDL.exe命令行的最后,它向Web服务器说明了WSDL文档的位置

使用举例:

Wsdl http://localhost/smsSend/WS_smsSender.asmx?WSDL

执行后,会生成一个WS_smsSender.cs代理类文件,然后可以把这个文件加入一个客户端项目或者使用vbc.exe命令行编译器把它编译成为一个DLL

例:vbc /t: library WS_smsSender.cs

 

二、 使用代理类

创建任何一个客户端的程序都包括以下步骤:

1)   创建一个代理类的实例;

WS_smsSender.Service1 CallWS_smsSend = new smsSender.WS_smsSender.Service1();

2)   调用代理对象上的方法;

CallWS_smsSend.smsSend(labPhone_no.Text,labsmsContent.Text,labOtherInfo.Text);

3)   获取从Web服务返回的XML格式的数据;

4)   编写客户端代码显示结果。

三、 术语表

1、   WSDL:Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。
怎样向别人介绍你的Web service有什么功能,以及每个函数调用时的参数呢?你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的Web Service。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具 既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应Web service的代码。

2、   UDDI:统一描述、发现和集成协议 (UDDI) 始于2000年,由 Ariba, IBM, Microsoft 和其他33家公司创立.UDDI registries 提供了一个机制,以一种有效的方式来浏览,发现Web Services 以及它们之间的相互作用.
如果你是编写商业软件,你应该开始考虑到UDDI的杠杆作用,它可以使你的用户能轻松发布他们的网络服务, 易于找到他们所需的Web services.如果你在一个大型企业内工作,有着多个分公司且都忙于建立Web services, 你应该考虑使用因特网,就像 UDDI, 在企业内部可以实现Web services 注册. 不管是商业或者网络用途,你可以通过发送和接收SOAP信息直接来编写UDDI API.

UDDI是作为应用web services的前端协议
主要作用是用来搜索INTERNET上可用的WEB SERVICE以及相关SERVICES的具体信息用的协议
如果要详细了解可以参考具体的web services服务的编写和应用
里面会讲到如UDDI以及SOAP等等协议的具体用途

 

 动态调用Web Service 
在visual stdio .net的开发环境中,使用web service通常的办法是通过添加WEB引用。

在实际的编程过程中出现了一个问题:添加的web引用在窗体中使用正常,在类中却不能使用。

那么,如何解决呢?

我们可以通过WSDL工具来生成web service的代理类,而生成的代理类是可以被类使用的。

在命令提示处,使用 Wsdl.exe 创建代理类,(至少)指定到 XML Web services 或服务说明的 URL 或到保存的服务说明的路径。 

Wsdl /language:language /protocol:protocol /namespace:myNameSpace /out:filename /username:username /password:password /domain:domain 

生成的代理类详细信息
当 Wsdl.exe 用于生成代理类时,将以指定的语言生成一个源文件。该文件包含公开 XML Web services 每个 XML Web services 方法的同步和异步方法的代理类。例如,如果一个 XML Web services 包含一个名为 Add 的 XML Web services 方法,则代理类具有以下方法用来调用 Add XML Web services 方法:Add、BeginAdd 和 EndAdd。代理类的 Add 方法用于与 Add XML Web services 方法进行同步通信,但 BeginAdd 和 EndAdd 方法用于和 XML Web services 方法进行异步通信。有关与 XML Web services 方法异步通信的更多信息,请参见与 XML Web services 进行异步通信。

生成的代理类的每个方法都包含适当的代码与 XML Web services 方法进行通信。如果在 XML Web services 和代理类通信过程中出现错误,则将引发一个异常。有关处理异常的详细信息,请参见在 XML Web services 中处理和引发异常。

在 XML Web services 方法和关联的代理类方法中的定义顺序之间,参数顺序可能有所不同。在多数情况下,参数顺序相同。但是,如果 XML Web services 需要 Document 格式的 SOAP 消息,则将出现一种参数顺序不相同的情况。如果 XML Web services 方法在定义输入参数之前定义了输出参数,则在代理类中输出参数放置在所有输入参数之后。例如,在下面的代码示例中,XML Web services 方法 MyWebMethod 在声明 inStr 输入参数之前声明了 outStr 输出参数。但是,在代理类中,在声明 outStr 之前先声明 inStr 参数。

在某些情况下,由 WSDL.exe 生成的代理类会使用一种不常见的命名方法,将对象强制转换成服务说明中指定的类型。因此,代理类中的生成类型可能不是开发人员想要或预期的类型。例如,当 WSDL.exe 在服务说明中遇到 ArrayList 类型时,它将在生成的代理类中创建一个“对象数组”。若要确保对象类型转换正确,请打开包含生成的代理类的文件,将所有不正确的对象类型更改成所需的对象类型。

 

Tgx.asmx.cs代码:
using  System;
using  System.Collections;
using  System.ComponentModel;
using  System.Data;
using  System.Diagnostics;
using  System.Web;
using  System.Web.Services;

namespace  news.WebService
{
    
/// 
    
/// Tgx 的摘要说明。
    
/// 

    [WebService(Namespace="news.WebService")]
    
public class Tgx : System.Web.Services.WebService
    
{
        
public Tgx()
        
{
            
//CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
            InitializeComponent();
        }


        
组件设计器生成的代码

        
// WEB 服务示例
        
// HelloWorld() 示例服务返回字符串 Hello World
        
// 若要生成,请取消注释下列行,然后保存并生成项目
        
// 若要测试此 Web 服务,请按 F5 键

        [WebMethod]
        
public DataSet GetTgxInfo(string ID)
        
{
                                                               DataSet ds 
= null;
            
return ds;
        }


    }

}


// ------------------------------------------------------------------------------
//  
//      This code was generated by a tool.
//      Runtime Version: 1.1.4322.2300
//
//      Changes to this file may cause incorrect behavior and will be lost if 
//      the code is regenerated.
//  
// ------------------------------------------------------------------------------

//  
//  此源代码由 wsdl, Version=1.1.4322.2300 自动生成。
//  
using  System.Diagnostics;
using  System.Xml.Serialization;
using  System;
using  System.Web.Services.Protocols;
using  System.ComponentModel;
using  System.Web.Services;


/// 
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(
" code " )]
[System.Web.Services.WebServiceBindingAttribute(Name
= " TgxSoap " , Namespace = " news.WebService " )]
public   class  Tgx : System.Web.Services.Protocols.SoapHttpClientProtocol  {
    
    
/// 
    public Tgx() {
        
this.Url = "http://localhost/news/webservice/tgx.asmx";
    }

    
    
/// 
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("news.WebService/GetTgxInfo", RequestNamespace="news.WebService", ResponseNamespace="news.WebService", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    
public System.Data.DataSet GetTgxInfo(string ID) {
        
object[] results = this.Invoke("GetTgxInfo"new object[] {
                    ID}
);
        
return ((System.Data.DataSet)(results[0]));
    }

    
    
/// 
    public System.IAsyncResult BeginGetTgxInfo(string ID, System.AsyncCallback callback, object asyncState) {
        
return this.BeginInvoke("GetTgxInfo"new object[] {
                    ID}
, callback, asyncState);
    }

    
    
/// 
    public System.Data.DataSet EndGetTgxInfo(System.IAsyncResult asyncResult) {
        
object[] results = this.EndInvoke(asyncResult);
        
return ((System.Data.DataSet)(results[0]));
    }

}


Tgx WSTgx 
=   new  Tgx();
    WSTgx.Url = Request.ServerVariables["HTTP_REFERER"].ToString().ToLower().Replace("/manage/tgx/tgxlist.aspx","")+"/webservice/tgx.asmx"; // 用于指定Web服务的服务器地址
DataSet ds  =  WSTgx.GetTgxInfo(GlobalClass.CheckRequestValue(Request.QueryString[ " ID " ].ToString(), true ));

你可能感兴趣的:(ASP.NET)