读书人

在客户段使用Javascript调用web服务,该

发布时间: 2012-02-02 23:57:14 作者: rapoo

在客户段使用Javascript调用web服务
按书上写了下面的代码

<WebService(Namespace:= "http://tempuri.org/ ")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class StocksWebService
Inherits System.Web.Services.WebService

<WebMethod()> _
Public Function GetStocks(ByVal CorpNameTxt As String) As String
Using con As New SqlConnection(WebConfigurationManager.ConnectionStrings( "chtNorthwind ").ConnectionString)
Dim SQLCmd As SqlCommand = con.CreateCommand()

SQLCmd.CommandText = "SELECT [持股数目] FROM [外资持股明细] WHERE [公司名称] = @CorpName "

SQLCmd.Parameters.Add( "@CorpName ", Data.SqlDbType.NVarChar, 12).Value = CorpNameTxt

con.Open()

Using dr As SqlDataReader = SQLCmd.ExecuteReader(CommandBehavior.SingleResult)
If dr.Read() Then
Return dr.GetSqlInt32(0).ToString
End If
End Using
End Using

Return Nothing
End Function
End Class

可是无法成功,请高人指点那里有错?

[解决办法]
请检查是否少了以下命名空间
Imports System.Web.Script.Services

你的代码再加一个特性
<WebService(Namespace:= "http://tempuri.org/ ")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<ScriptService()> _

还有要学会使用失败时的回调函数
[解决办法]
http://blog.csdn.net/fengyecsdn/archive/2007/08/18/1749845.aspx


首先说一下,这个问题和AJAX难以分开.其实现方法和AJAX非常类似.有AJAX经验的朋友就很容易理解.

我这里举例的项目没有直接使用MS的AJAX框架而是只引用了该框架中的一个关键DLL和两段脚本.下边我会清楚的说明JS访问WEB SERVICES的具体流程.

首先:准备一个SERVICE,在SERVICE中要加上下边两个引用.

using System.Web.Script.Services;
using System.Web.Script.Serialization;
这两个引用自System.Web.Extensions.dll
没有的话去MS下载, 在MS的AJAX包中就包含

SERVICE.CS代码中
[ScriptService]
public class ElmService : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
public string GetElm(string inComType, string inActElmID, string inEftElmsID, string inParamList)


{

…………

}
}
//注意[ScriptService]这个标记 /JS请求就是靠这个标记才输出脚本 脚本内容是对服务的类和方法以及返回结构的封装


第二:在页面上加上三个脚本

脚本A: <script src= 'script/AJAXSERVICE.js ' type= 'text/javascript '> </script> //这个脚本是MS对.NET基本类型和方法的JS版封装,我自己提取出来的,如果页面使用了MS.AJAX框架那么这个JS就已经存在了,不用手动添加了,下边有专门解释。

脚本B: <script src= 'ElmService.asmx/js ' type= 'text/javascript '> </script> //这个是SERVICE自动生成的,[ScriptService]的功劳。

脚本C: <script src= 'scritp/myservice.js ' type= 'text/javascript '> </script> //这个是自己写的脚本,具体的使用服务返回结果的代码。根据业务需要自己写。

在B中,已经有了一个JS对象ElmService和JS方法ElmService.GetElm( inComType, inActElmID, inEftElmsID, ceparamlist, CE_ShowResult, CE_ShowError);
我们看到这个JS方法中的参数和SERVICE代码中的参数基本一样,但是多了两个。这两个其实是方法名。这两个方法是需要我们在脚本C中手写的。分别处理调用服务后正常的返回结果,或者处理调用失败、超时、异常等情况。

脚本C中我们写了这两个方法。

function CE_ShowError( inError) //处理调用SERVICE超时或者处理错误结果
{
alert( "服务请求出现错误,也许是因为您的网络出现问题。\r\n您可以稍后再试一次,或者检查您的网络。\r\n The Request has some error, may be your network has some problem. \r\n You can try it later, or cheak your network. ");
alert( "ErrorMessage: "+inError.get_message());
CE_ShowResultDo();
}
function CE_ShowResult( inServiceResult)// 处理SERVICE返回的正常结果.
{
var tmpstrkk=inServiceResult.replace( " <?xml version=\ "1.0\ " encoding=\ "utf-8\ " ?> ", " ").replace( " <string xmlns=\ "http://tempuri.org/\ "> " , " ").replace( " </string> " , " ");
var ce_ResultBodyArray=CE_GetResultArray(tmpstrkk);
for (p=0;p <CE_EftElmsIDandHTML.length;p++)
{
for (q=0;q <ce_ResultBodyArray.length;q++)
{
var tmpidkk=CE_EftElmsIDandHTML[p].ElmID;
var tmpidkkk=ce_ResultBodyArray[q].ElmID;
if (tmpidkk.toUpperCase()==tmpidkkk.toUpperCase())
{
CE_EftElmsIDandHTML[p].ElmHTML=ce_ResultBodyArray[q].ElmHTML;
}
}

}
CE_ShowResultDo();
}


第三:我们自己的事件触发SERVICE调用

比如我们有个按扭,ONCLICK= "DoService(); "

我们脚本C中当然要有DoService()方法

function DoService()

{

var inComType= "Com1 "; var inActElmID= "Elm1 "; inEftElmsID= "Elm1,Elm2 "; ceparamlist= "abc=1,bcd=3 ";

ElmService.GetElm( inComType, inActElmID, inEftElmsID, ceparamlist, CE_ShowResult, CE_ShowError);

}

大家看到了,这里调用GETELM方法是没有返回结果的。SERVICE的返回结果是通过 "成功方法 " CE_ShowResult来返回的。

根据我们以前的定义function CE_ShowResult( inServiceResult)

inServiceResult就是返回结果了。当SERVICE的返回类型很简单,数字、字符串等返回类型的时候,我们可以直接JS中使用,因为JS是弱类型嘛。可如果返回的是复杂类型数据呢? 现在该我们的脚本A大显身手了。

先说下脚本B,脚本B中不仅仅是SERVICE的类型,还包括返回值类型的封装。但是我们知道在SERVICE中.NET类型和JS中的类型有很大差距的。所以脚本B也要用基本类型来构建我们的结果类型。它是根据什么基本类型实现呢?就是脚本A的内容。脚本A中把.NET的基本数据类型用JS封装了一遍(MS就是牛B)。

比如脚本A中的 int类型就包括了比JS中数字类型更丰的方法,而且命名规则和.NET环境中一样。DateTime类型也提供了与.NET环境中一样的方法,比如 DateTime.ToShotTimeString()方法。 这样我们使用和处理SERVICE返回的复杂数据类型就可以很方便的使用了。

如SERVICE.CS中返回的数据类型是

public class aabb
{
public string name;
public DateTime SiTime;
public int count;
}
那么我们在JS脚本 function CE_ShowResult( inServiceResult) 中就可以写这样的代码:

var res=inServiceResult.name+ "_ "+inServiceResult.count.ToString()+ "_ "+inServiceResult.SiTime.ToLongDateString();



顺便说一下在失败处理函数中 inError.get_message() 这也是在脚本B中封装的。

更多的具体高级处理方法和事件,大家可以仔细研究下脚本B和脚本A

脚本A是通过MS的AJAX框架导出的。它本身封在DLL内。

大家可以自己MS.AJAX作一个简单站点,然后查看页面显示出来的代码,把这个JS导出来。稍后我也会把这个文件传到CSDN上来。





第四:

希望大家早日能作出一个全站SERVICE加JS的新型站点。这样的站点比AJAX要快,而且服务压力会小的多的多。

……

本来还有个问题想说明一下,现在脑子不好使想不起来了。我想起来后会在后边跟上。先写到这。

读书人网 >asp.net

热点推荐