ASP.NET Web 服务






4.70/5 (66投票s)
创建 ASP.NET Web 服务的教程
引言
我们现在可以使用 ASP.NET 来创建基于行业标准(包括 XML、SOAP 和 WSDL)的 Web 服务。
ASP.NET Web 服务支持使用 HTTP-POST、HTTP-GET 和 SOAP 协议调用公开方法的客户端,具体取决于您的具体要求,您可以选择一种方法而非其他方法。HTTP-GET 或 HTTP-POST 与 SOAP 之间的主要区别在于 SOAP 支持的数据类型更丰富,因为 SOAP 使用 XSD schema 来表示复杂数据类型。
以下是我用于测试 ASP.NET Web 服务构建的示例代码
步骤 1:创建 ASP.NET Web 服务源文件
ASP.NET Web 服务文件名具有 `asmx` 扩展名,我的文件名是 `MyWebService.asmx`,源文件如下所示
文件:MyWebService.asmx
<%@ WebService Language="C#" class="MyClass" %>
using System.Web.Services ;
public class MyClass
{
[WebMethod()]
public int Add ( int a, int b)
{
return a + b ;
}
}
需要 `WebService` 指令,而类是公开 Web 服务的 .NET 类的名称,每个公开为 Web 服务类方法的都需要在其前面有一个声明性属性语句 `[WebMethod()]`。这里 .NET 类实现包含在 ASP.NET Web 服务文件的同一文件中,但这不是强制性的,我们可以选择包含外部 .NET `Assembly` 来实现服务,如下例所示
文件:MyWebService2.asmx
<%@ WebService Language="C#" class="MyWebService.MyStringReverse, MyWebServiceImpl" %>
文件 `MyWebService2.asmx` 引用了另一个 .NET `Assembly` `MyWebServiceImpl`,它位于 `/bin` ASP.NET 应用程序子文件夹下(请注意,ASP.NET 中程序集的默认位置是每个 ASP.NET 应用程序下的 /bin 子文件夹)。.NET `Assembly` `MyWebServiceImpl` 的源文件是用 C# 编写的,如下所示
文件:MyWebServiceImpl.cs
namespace MyWebService
{
using System ;
using System.Web.Services ;
public class MyStringReverse: WebService
{
[WebMethod(Description="Reverse String")]
public String ReverseString ( String InString )
{
// Check null String
if ( InString == null ) return null ;
Int32 intSize = InString.Length ;
char[] arrayInString = InString.ToCharArray() ;
char[] arrayOutString = new char[intSize] ;
for (Int32 i = 0 ; i < intSize ; ++i)
arrayOutString[i] = arrayInString[intSize-i-1] ;
return new String(arrayOutString) ;
}
}
}
要创建 `Assembly`,可以使用以下命令
C:\>CSC /t:library /out:bin/MyWebServiceImpl.dll MyWebServiceImpl.cs
接下来的部分我将继续使用 `MyWebService.asmx` 作为我的实验 Web 服务。
步骤 2:创建 ASP.NET Web 服务客户端
有多种消耗 Web 服务的方式,这里有三个示例。第一个使用 HTTP-POST 协议,它具有与当今应用程序良好共存的优点,使用 HTTP-GET 类似,我让读者自己尝试。第二个使用 WSDL 工具生成的 SOAP 代理客户端对象,它为程序员提供了熟悉的面向对象模型,他们可以调用生成的代理接口所提供的方法。最后一个使用 SOAP 标准请求消息,并在 XMLHTTP COM 对象(由 Microsoft XML Parser 3.0 安装)的帮助下解析 SOAP 响应消息。
客户端使用 HTTP-POST 方法
示例是一个 ASP.NET 页面 `TestWebService.aspx`,源文件如下所示
文件:TestWebService.aspx
<html>
<body>
<form action="https:///ASP.NET/MyWebService.asmx/Add" method="POST">
<input name="a"></input>
<input name="b"></input>
<input type="submit" value="Enter"> </input>
</form>
</body>
</html>
ASP 页面通过 HTTP-POST 协议接受浏览器参数并调用 Web 服务 `MyWebService` 的 `Add` 方法,结果将是一个 XML 消息,需要客户端应用程序进一步解析。要解析响应,客户端可以使用 applet 中的 Java XML 解析器或使用 IE5 的 DOM 对象。
以下是输入参数 `a=1`、`b=2` 时的 XML 响应示例
<?xml version="1.0" encoding="utf-8" ?>
<int xmlns="http://tempuri.org/">3</int>
客户端使用 WSDL 生成的代理对象
如果您的客户端是 Windows 应用程序或 ASP.NET 应用程序,您可以使用 WSDL.EXE 工具创建标准的 .NET 程序集来为您的客户端提供代理类。
以下是您可以遵循并尝试的步骤
使用 WSDL.EXE 工具以您选择的任何语言创建代理类源文件,这里我使用 C#,命令如下
C:\>wsdl /language:C# /out:MyProxyClass.cs https:///ASP.NET/MyWebService.asmx
生成了 `MyProxyClass.cs`,源文件如下所示
文件:MyProxyClass.cs
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.0.2914.16
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
//
// This source code was auto-generated by wsdl, Version=1.0.2914.16.
//
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.Web.Services;
[System.Web.Services.WebServiceBindingAttribute(Name="MyClassSoap", Namespace="http://tempuri.org/")]
public class MyClass : System.Web.Services.Protocols.SoapHttpClientProtocol {
[System.Diagnostics.DebuggerStepThroughAttribute()]
public MyClass() {
this.Url = "https:///ASP.NET/MyWebService.asmx";
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Add",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int Add(int a, int b) {
object[] results = this.Invoke("Add", new object[] {
a,
b});
return ((int)(results[0]));
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
public System.IAsyncResult BeginAdd(int a, int b, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("Add", new object[] {
a,
b}, callback, asyncState);
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
public int EndAdd(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0]));
}
}
然后我们需要创建供客户端使用的 .NET `Assembly`
C:\> csc /t:library MyProxyClass.cs
以上命令将编译源文件并创建 `MyProxyClass.dll` 库文件。
我使用 ASP 来演示如何使用代理对象,文件是 `TestWebServiceWithProxy.aspx`,源文件如下所示
文件:TestWebServiceWithProxy.aspx
<%@ page language="C#" %>
<html>
<script runat="server">
void btn_click(Object source, EventArgs e)
{
MyClass mycls = new MyClass() ;
int x = Int32.Parse(a.Text) ;
int y = Int32.Parse(b.Text);
Message.Text = mycls.Add( x, y).ToString() ;
}
</script>
<body>
<form Action = "TestWebServiceWithProxy.aspx" runat="server">
<asp:TextBox id="a" runat="server" />
<asp:TextBox id="b" runat="server" />
<asp:button id=btn OnClick="btn_click" Text="Enter" runat="server" />
<p><asp:label id="Message" runat="server" /></P>
</form>
</body>
</html>
客户端使用 XMLHTTP 通过 SOAP 调用 Web 服务
要充分利用 SOAP 功能,您可以选择通过 SOAP 核心协议调用您的 ASP.NET Web 服务,这里我提供另一个示例供参考。
为了用 SOAP 协议测试 ASP.NET 服务,我创建了一个 ASP 客户端文件 `TestWebServiceByXML.asp`,其源文件如下所示
文件:TestWebServiceByXML.asp
<html>
<body>
<script language="jscript">
function btn_click (a, b)
{
var xmlObj = new ActiveXObject("Msxml2.DOMDocument") ;
var sXml = "<?xml version=\"1.0\" ?>" ;
sXml += "<soap:Envelope "
sXml += "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " ;
sXml += "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " ;
sXml += "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" ;
sXml += "<soap:Body>" ;
sXml += "<Add xmlns=\"http://tempuri.org/\">" ;
sXml = sXml + "<a>" + a.value + "</a>" ;
sXml = sXml + "<b>" + b.value + "</b>" ;
sXml += "</Add></soap:Body></soap:Envelope>"
// Try to parse the XML string into DOM object
xmlObj.loadXML(sXml) ;
//To see the validated XML string is well-formed
XmlRequest.innerText = xmlObj.xml ;
var xmlHTTP = new ActiveXObject("Msxml2.XMLHTTP") ;
xmlHTTP.Open ( "Post", "https:///ASP.NET/MyWebService.asmx", false) ;
xmlHTTP.setRequestHeader("SOAPAction", "http://tempuri.org/Add") ;
xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8" ) ;
xmlHTTP.Send(xmlObj.xml) ;
MyResult.innerText = xmlHTTP.responseText ;
var xmlResponse = xmlHTTP.responseXML ;
answer.innerText = xmlResponse.selectSingleNode("soap:Envelope/soap:Body/AddResponse/AddResult").text ;
}
</script>
<form>
<p>Please input a:<input id="a" name="a"></input></p>
<p>Please input b:<input id="b" name="b"></input></p>
<p>
<input type="button" id="btn" value="Enter"
onclick="jscript:btn_click(a, b)"></input>
</p>
<p>Answer is <span id="answer"></span></p>
<hr></hr>
<p>Request:</p>
<span id="XmlRequest"></span>
<p>Response:</p>
<span id="MyResult"></span>
</form>
</body>
</html>
我在客户端机器上安装了 Microsoft XML Parser 3.0,它为我提供了 XMLHTTP 和 DOM COM 对象来测试我的应用程序。
摘要
SOAP 服务有很多不同的实现,但标准是存在的,我们可以开始在此基础上构建一些有用的应用程序。尽管 ASP.NET 或 SOAP Web 服务有很多优点,但如果您想在客户端中使用公开的 Web 服务,请确保您已安装最新的库,因为标准在不断发展,所有供应商都在尽力在这种开放标准战争中取得优势。