新瓶旧酒ASP.NET AJAX(9) - 客户端脚本编程(Sys.Net命名空间下的WebServiceProxy、WebServiceError、Generated Proxy Classes以及调用WebService、PageMethod)

ABP应用开发(Step by Step)-下篇 🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 测试 ProductAppService 类 启动模板附带测试基础架构,包括xUnit、Shouldly和NSubstitute库。它使用SQLite 内存数据库来模拟 阅读详情
[索引页]
[源码下载]


新瓶旧酒ASP.NET AJAX(9) - 客户端脚本编程(Sys.Net命名空间下的WebServiceProxy、WebServiceError、Generated Proxy Classes以及调用WebService、PageMethod)


作者: webabcd


介绍
使用ASP.NET AJAX调用WebService(简单类型和复杂对象、JSON和XML)和PageMethod。Sys.Net命名空间下的WebServiceProxy Class、WebServiceError Class、Generated Proxy Classes


关键
1、调用WebService
    ·为WebService类或需要暴露给客户端的WebService方法添加[System.Web.Script.Services.ScriptService]属性
    ·为WebService类中需要暴露给客户端使用的方法添加[System.Web.Services.WebMethod]属性
    ·在ScriptManager控件的Services集合中添加对该WebService的引用
    ·客户端调用方法:[NameSpace].[ClassName].[MethodName](param1, param2, ..., succeededCallback, failedCallback, userContext)
    ·如果用GET方式的话,则在WebService方法添加[System.Web.Script.Services.ScriptMethod(UseHttpGet = true)]属性
    ·用到了复杂类型的话,则在WebService类上添加[System.Web.Script.Services.GenerateScriptType(typeof(TypeName))]属性。另外,该复杂类型必须要有一个无参数的构造函数
    ·禁止将某属性输出到客户端,则在该属性上添加[System.Web.Script.Serialization.ScriptIgnore]属性
    ·以XML方式输出到客户端(一般是JSON),则在WebService方法添加[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]属性。如果要避免ASP.NET AJAX为我们做自动转换,则应该添加[ScriptMethod(ResponseFormat = ResponseFormat.Xml, XmlSerializeString = true)]属性
    ·以XML方式输出到客户端的复杂对象的属性,在属性上添加[System.Xml.Serialization.XmlAttribute]属性(可不写)。若禁止将其输出到客户端,则在属性上添加[System.Xml.Serialization.XmlIgnore]属性。
    ·WebService判断用户是否通过验证 - HttpContext.Current.User.Identity.IsAuthenticated
    ·WebService使用Session - HttpSessionState session = HttpContext.Current.Session;

2、调用PageMethod
    ·ASP.NET页面中的方法需要时Public和Static的
    ·为该方法添加[System.Web.Services.WebMethod]属性
    ·设置ScriptManager控件的EnablePageMethods="true"
    ·客户端调用方法:PageMethods.[MethodName](param1, param2, ..., callbackFunction);

3、WebServiceProxy Class
    var webRequest = Sys.Net.WebServiceProxy.invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);
    ·path - WebService的url
    ·methodName - 调用的方法名
    ·useHttpGet - 是否使用HTTP GET方式
    ·parameters - 参数(示例:{"param1":196610, "param2":"Hello"})
    ·succeededCallback - 调用成功的回调函数
    ·failedCallback - 调用失败的回调函数
    ·userContext - 用户上下文
    ·timeout - 超时时间
    ·返回值 - 相关的WebRequest对象

4、WebServiceError Class
    ·exceptionType - 服务器端异常的具体类型
    ·message - 详细的异常描述信息
    ·stackTrace - 服务器端异常的堆栈跟踪信息
    ·statusCode - 造成异常的HTTP响应的状态码
    ·timedOut - 异常是否是由于网络连接超时造成的

5、Generated Proxy Classes属性
    ·defaultSucceededCallback - 调用成功的回调函数
    ·defaultFailedCallback - 调用失败的回调函数
    ·defaultUserContext - 用户上下文
    ·path - WebService的路径
    ·timeout - 超时时间

6、Generated Proxy Classes(调用Web Service)
    var myServiceProxy = MyNameSpace.MyService();
    myServiceProxy.MyServiceMethod(param1, param2, ..., succeededCallback, failedCallback, userContext);
    ·param - 在前面顺序地写参数
    ·succeededCallback - 调用成功的回调函数
    ·failedCallback - 调用失败的回调函数
    ·userContext - 调用成功的回调函数

7、Generated Proxy Classes(调用成功的回调函数)
    function succeededCallback(result, userContext, methodName) { }
    ·result - 调用WebService的方法后返回的数据
    ·userContext - 用户上下文
    ·methodName - 调用的方法名

8、Generated Proxy Classes(调用失败的回调函数)
    function failedCallback(error, userContext, methodName) { }
    ·error - 调用WebService的方法后返回的数据(Sys.Net.WebServiceError对象)
    ·userContext - 用户上下文
    ·methodName - 调用的方法名


示例
Hello.asmx
<% @ WebService Language = " C# "  Class = " Hello "   %>

using  System;
using  System.Web;
using  System.Web.Services;
using  System.Web.Services.Protocols;
using  System.Web.Script.Services;

[WebService(Namespace 
=   " http://tempuri.org/ " )]
[WebServiceBinding(ConformsTo 
=  WsiProfiles.BasicProfile1_1)]
[ScriptService]
public   class  Hello : System.Web.Services.WebService
{
    [WebMethod]
    
// 如果用GET方式的话,[ScriptMethod(UseHttpGet = true)]
    public string Say(string name)
    
{
        
return String.Format("WebService Hello {0}", name);
    }


    [WebMethod]
    
// 如果用GET方式的话,[ScriptMethod(UseHttpGet = true)]
    public int SayError(int a, int b)
    
{
        
return a / b;
    }

}

Hello.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" Title="WebService、PageMethod、WebServiceError Class"  %>

<% @ Import Namespace="System.Web.Services"  %>
< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >

    
< script  runat ="Server" >
        
        [WebMethod]
        public static string Say(string name)
        
{
            
return String.Format("PageMethod Hello {0}", name);
        }


    
</ script >

    
< asp:ScriptManagerProxy  ID ="ScriptManagerProxy1"  runat ="server" >
        
< services >
            
< asp:ServiceReference  Path ="Hello.asmx"   />
        
</ services >
    
</ asp:ScriptManagerProxy >
    
< input  type ="text"  id ="txtName"  value ="webabcd"   />
    
< input  type ="button"  id ="btnHelloWebService"  value ="HelloWebService"  onclick ="btnHelloWebService_click()"   />
    
< input  type ="button"  id ="btnHelloPageMethod"  value ="HelloPageMethod"  onclick ="btnHelloPageMethod_click()"   />
    
< input  type ="button"  id ="btnContext"  value ="HelloContext"  onclick ="btnHelloContext_click()"   />
    
< input  type ="button"  id ="btnHelloError"  value ="HelloError"  onclick ="btnHelloError_click()"   />
    
< br  />< br  />
    
< div  id ="result"   />

    
< script  type ="text/javascript" >
        
function btnHelloWebService_click() 
        
{
            
var name = $get("txtName").value;
            Hello.Say(name, onSucceeded);
        }


        
function btnHelloPageMethod_click() 
        
{
            
var name = $get("txtName").value;
            PageMethods.Say(name, onSucceeded);
        }

        
        
function btnHelloContext_click() 
        
{
            
var name = $get("txtName").value;
            Hello.Say(name, onHelloContextSucceeded, 
null, jsonContext);
        }


        
function btnHelloError_click() 
        
{
            Hello.SayError(
100, 0, onSucceeded, onFailed);
        }


        
function onSucceeded(result) 
        
{
            $get(
"result").innerHTML = result + "<br />";
        }

        
        
function onHelloContextSucceeded(result, context) 
        
{
            $get(
"result").innerHTML = result + "<br />";
            
            $get(
"result").innerHTML += context.Name + "<br />";
            $get(
"result").innerHTML += context.Age + "<br />";
        }

        
        
function onFailed(error) 
        
{
            
// error - Sys.Net.WebServiceError对象
        
            
// exceptionType - 服务器端异常的具体类型
            $get("result").innerHTML = "Exception Type:" + error.get_exceptionType() + "<br />";
            
// message - 详细的异常描述信息
            $get("result").innerHTML += "Message:" + error.get_message() + "<br />";
            
// stackTrace - 服务器端异常的堆栈跟踪信息
            $get("result").innerHTML += "Stack Trace:" + error.get_stackTrace() + "<br />";
            
// statusCode - 造成异常的HTTP响应的状态码
            $get("result").innerHTML += "Status Code:" + error.get_statusCode() + "<br />";
            
// timedOut - 异常是否是由于网络连接超时造成的
            $get("result").innerHTML += "Timed Out:" + error.get_timedOut() + "<br />";
        }

        
        
var jsonContext = 
        
{
            Name: 
"webabcd",
            Age: 
27
        }
;

    
</ script >

</ asp:Content >

运行结果
1、单击“HelloWebService”按钮
WebService Hello webabcd

2、单击“HelloPageMethod”按钮
PageMethod Hello webabcd

3、单击“HelloContext”按钮
WebService Hello webabcd
webabcd
27

4、单击“HelloError”按钮
Exception Type:System.DivideByZeroException
Message:试图除以零。
Stack Trace: 在 Hello.SayError(Int32 a, Int32 b) 位置 c:/Documents and Settings/wanglei/桌面/AJAX/Web/WebService/Hello.asmx:行号 25
Status Code:500
Timed Out:false


Sample.asmx
<% @ WebService Language = " C# "  Class = " Sample "   %>

using  System;
using  System.Web;
using  System.Web.Services;
using  System.Web.Services.Protocols;
using  System.Web.Script.Services;
using  System.Collections.Generic;
using  System.Text;
using  System.Data;

[WebService(Namespace 
=   " http://tempuri.org/ " )]
[WebServiceBinding(ConformsTo 
=  WsiProfiles.BasicProfile1_1)]
[GenerateScriptType(
typeof (Person))]
[ScriptService]
public   class  Sample : System.Web.Services.WebService
{
    [WebMethod]
    
public string SimpleTypeTest(
        
string stringTest, bool boolTest, int intTest, float floatTest,
        DateTime datetimeTest, DayOfWeek enumTest)
    
{
        
return String.Format("stringTest:{0};boolTest:{1};intTest:{2};floatTest:{3};datetimeTest:{4};enumTest:{5}",
            stringTest, boolTest, intTest, floatTest, datetimeTest, enumTest);
    }



    [WebMethod]
    
public Person GetPerson()
    
{
        
return new Person("webabcd", 27);
    }

    [WebMethod]
    
public string SetPerson(Person p)
    
{
        
return String.Format("Name:{0};Age:{1}", p.Name, p.Age);
    }



    [WebMethod]
    
public List<Person> GetList()
    
{
        List
<Person> list = new List<Person>();

        
for (int i = 0; i < 10; i++)
        
{
            Person p 
= new Person(i.ToString().PadLeft(4, '0'), i + 20);
            list.Add(p);
        }


        
return list;
    }

    [WebMethod]
    
public string SetList(List<Person> list)
    
{
        StringBuilder sb 
= new StringBuilder();

        sb.Append(
"<table border='1'>");
        
foreach (Person p in list)
        
{
            sb.Append(
"<tr>");
            sb.Append(
"<td>Name:" + p.Name + "</td>");
            sb.Append(
"<td>Age:" + p.Age + "</td>");
            sb.Append(
"</tr>");
        }

        sb.Append(
"</table>");

        
return sb.ToString();
    }



    [WebMethod]
    
public Dictionary<string, Person> GetDictionary()
    
{
        Dictionary
<string, Person> dictionary = new Dictionary<string, Person>();

        
for (int i = 0; i < 10; i++)
        
{
            Person p 
= new Person(i.ToString().PadLeft(4, '0'), i + 20);

            dictionary.Add(i.ToString(), p);
        }


        
return dictionary;
    }



    [WebMethod]
    
public DataTable GetDataTable()
    
{
        DataTable dt 
= new DataTable();

        dt.Columns.Add(
new DataColumn("Name", typeof(string)));
        dt.Columns.Add(
new DataColumn("Age", typeof(int)));

        
for (int i = 0; i < 10; i++)
        
{
            DataRow dr 
= dt.NewRow();
            dr[
"Name"] = i.ToString().PadLeft(4, '0');
            dr[
"Age"] = i + 20;

            dt.Rows.Add(dr);
        }


        
return dt;
    }



    [WebMethod]
    [ScriptMethod(ResponseFormat 
= ResponseFormat.Xml)]
    
// 避免ASP.NET AJAX为我们做自动转换,[ScriptMethod(ResponseFormat = ResponseFormat.Xml, XmlSerializeString = true)]
    public List<Person> GetXml()
    
{
        
return GetList();
    }

}

Sample.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" Title="WebService(简单类型和复杂对象、JSON和XML)"  %>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< asp:ScriptManagerProxy  ID ="ScriptManagerProxy1"  runat ="server" >
        
< services >
            
< asp:ServiceReference  Path ="Sample.asmx"   />
        
</ services >
    
</ asp:ScriptManagerProxy >
    
< input  type ="button"  id ="btnSimpleTypeTest"  value ="SimpleTypeTest"  onclick ="btnSimpleTypeTest_click()"   />
    
< input  type ="button"  id ="btnGetPerson"  value ="GetPerson"  onclick ="btnGetPerson_click()"   />
    
< input  type ="button"  id ="btnSetPerson"  value ="SetPerson"  onclick ="btnSetPerson_click()"   />
    
< input  type ="button"  id ="btnGetList"  value ="GetList"  onclick ="btnGetList_click()"   />
    
< input  type ="button"  id ="btnSetList"  value ="SetList"  onclick ="btnSetList_click()"   />
    
< input  type ="button"  id ="btnGetDictionary"  value ="GetDictionary"  onclick ="btnGetDictionary_click()"   />
    
< input  type ="button"  id ="btnGetDataTable"  value ="GetDataTable"  onclick ="btnGetDataTable_click()"   />
    
< input  type ="button"  id ="btnGetXml"  value ="GetXml"  onclick ="btnGetXml_click()"   />
    
< br  />< br  />
    
< div  id ="result"   />

    
< script  type ="Text/javascript" >
        
function btnSimpleTypeTest_click() 
        
{
            Sample.SimpleTypeTest(
"abc", false, 1, 1.1, new Date(), System.DayOfWeek.Sunday, onSimpleTypeTestSucceeded);
        }

        
function onSimpleTypeTestSucceeded(result) 
        
{
            $get(
"result").innerHTML = result + "<br />";
        }

        
        
        
function btnGetPerson_click() 
        
{
            Sample.GetPerson(onGetPersonSucceeded);
        }

        
function onGetPersonSucceeded(result) 
        
{
            $get(
"result").innerHTML = String.format("Name:{0};Age:{1}<br />", result.Name, result.Age);
        }

        
        
        
function btnSetPerson_click() 
        
{
            
// var p = new Object();

            
var p = new Person();
            p.Name 
= "webabcd";
            p.Age 
= 27;
            Sample.SetPerson(p, onSetPersonSucceeded);
        }

        
function onSetPersonSucceeded(result)
        
{
            $get(
"result").innerHTML = result + "<br />";
        }

        
        
        
function btnGetList_click() 
        
{
            Sample.GetList(onGetListSucceeded);
        }

        
function onGetListSucceeded(result) 
        
{
            
var sb = new Sys.StringBuilder();
            
            sb.append(
"<table border='1'>");
            
for (var i=0; i<result.length; i++)
            
{
                sb.append(
"<tr>");
                sb.append(
"<td>Name:" + result[i].Name + "</td>");
                sb.append(
"<td>Age:" + result[i].Age + "</td>");
                sb.append(
"</tr>");
            }

            sb.append(
"</table>");

            $get(
"result").innerHTML = sb.toString();
        }

        
        
        
function btnSetList_click() 
        
{
            
var ary = new Array();
            
for (var i = 0 ; i < 10; i++) 
            
{
                
var p = new Person();
                p.Name 
= i + 1000;
                p.Age 
= i + 20;
                
                Array.add(ary, p);
            }


            Sample.SetList(ary, onSetListSucceeded);
        }

        
function onSetListSucceeded(result) 
        
{
            $get(
"result").innerHTML = result;
        }

        
        
        
function btnGetDictionary_click() 
        
{
            Sample.GetDictionary(onGetDictionarySucceeded);
        }

        
function onGetDictionarySucceeded(result) 
        
{        
            
var sb = new Sys.StringBuilder();
            
            sb.append(
"<table border='1'>");
            
for (var key in result)
            
{
                
var p = result[key];

                sb.append(
"<tr>");
                sb.append(
"<td>Name:" + p.Name + "</td>");
                sb.append(
"<td>Age:" + p.Age + "</td>");
                sb.append(
"</tr>");
            }

            sb.append(
"</table>");

            $get(
"result").innerHTML = sb.toString();
        }

        
        
        
function btnGetDataTable_click() 
        
{
            Sample.GetDataTable(onGetDataTableSucceeded);
        }

        
function onGetDataTableSucceeded(result) 
        
{        
            
var sb = new Sys.StringBuilder();
            
            sb.append(
"<table border='1'>");
            
for (var i=0; i<result.rows.length; i++)
            
{
                sb.append(
"<tr>");
                sb.append(
"<td>Name:" + result.rows[i].Name + "</td>");
                sb.append(
"<td>Age:" + result.rows[i].Age + "</td>");
                sb.append(
"</tr>");
            }

            sb.append(
"</table>");

            $get(
"result").innerHTML = sb.toString();
        }

        
        
        
function btnGetXml_click()
        
{
            Sample.GetXml(onGetXmlSucceeded);
        }

        
function onGetXmlSucceeded(result)
        
{
            
if (document.all)
            
{
                $get(
"result").innerText = "/r/n" + result.xml;
            }

            
else
            
{
                
// Firefox
                $get("result").textContent = "/r/n首节点:" + result.documentElement.nodeName;
            }

        }

    
</ script >

</ asp:Content >

运行结果
1、单击“SimpleTypeTest”按钮
stringTest:abc;boolTest:False;intTest:1;floatTest:1.1;datetimeTest:2007-7-5 0:59:35;enumTest:Sunday

2、单击“GetPerson”按钮
Name:webabcd;Age:27

3、单击“SetPerson”按钮
Name:webabcd;Age:27

4、单击“GetList”按钮
Name:0000Age:20
Name:0001Age:21
Name:0002Age:22
Name:0003Age:23
Name:0004Age:24
Name:0005Age:25
Name:0006Age:26
Name:0007Age:27
Name:0008Age:28
Name:0009Age:29

5、单击“SetList”按钮
Name:1000Age:20
Name:1001Age:21
Name:1002Age:22
Name:1003Age:23
Name:1004Age:24
Name:1005Age:25
Name:1006Age:26
Name:1007Age:27
Name:1008Age:28
Name:1009Age:29

6、单击“GetDictionary”按钮
Name:0000Age:20
Name:0001Age:21
Name:0002Age:22
Name:0003Age:23
Name:0004Age:24
Name:0005Age:25
Name:0006Age:26
Name:0007Age:27
Name:0008Age:28
Name:0009Age:29

7、单击“GetDataTable”按钮
Name:0000Age:20
Name:0001Age:21
Name:0002Age:22
Name:0003Age:23
Name:0004Age:24
Name:0005Age:25
Name:0006Age:26
Name:0007Age:27
Name:0008Age:28
Name:0009Age:29

8、单击“GetXml”按钮
<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Person><Name>0000</Name><Age>20</Age></Person>
<Person><Name>0001</Name><Age>21</Age></Person>
<Person><Name>0002</Name><Age>22</Age></Person>
<Person><Name>0003</Name><Age>23</Age></Person>
<Person><Name>0004</Name><Age>24</Age></Person>
<Person><Name>0005</Name><Age>25</Age></Person>
<Person><Name>0006</Name><Age>26</Age></Person>
<Person><Name>0007</Name><Age>27</Age></Person>
<Person><Name>0008</Name><Age>28</Age></Person>
<Person><Name>0009</Name><Age>29</Age></Person>
</ArrayOfPerson>


GeneratedProxy.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" Title="Generated Proxy Classes"  %>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< asp:ScriptManagerProxy  ID ="ScriptManagerProxy1"  runat ="server" >
        
< services >
            
< asp:ServiceReference  Path ="Hello.asmx"   />
        
</ services >
    
</ asp:ScriptManagerProxy >
    
< p >
        调用Web Service
        
< br  />
        var myServiceProxy = MyNameSpace.MyService();
        
< br  />
        myServiceProxy.MyServiceMethod(param1, param2, , succeededCallback, failedCallback,
        userContext);
    
</ p >
    
< ul >
        
< li > param - 在前面顺序地写参数  </ li >
        
< li > succeededCallback - 调用成功的回调函数  </ li >
        
< li > failedCallback - 调用失败的回调函数  </ li >
        
< li > userContext - 调用成功的回调函数  </ li >
    
</ ul >
    
< p >
        调用成功的回调函数
        
< br  />
        function succeededCallback(result, userContext, methodName) { }
    
</ p >
    
< ul >
        
< li > result - 调用WebService的方法后返回的数据  </ li >
        
< li > userContext - 用户上下文  </ li >
        
< li > methodName - 调用的方法名  </ li >
    
</ ul >
    
< p >
        调用失败的回调函数
        
< br  />
        function failedCallback(error, userContext, methodName) { }
    
</ p >
    
< ul >
        
< li > error - 调用WebService的方法后返回的数据(Sys.Net.WebServiceError对象)  </ li >
        
< li > userContext - 用户上下文  </ li >
        
< li > methodName - 调用的方法名  </ li >
    
</ ul >
    
< p >
        
< input  type ="text"  id ="txtName"  value ="webabcd"   />
        
< input  type ="button"  id ="btnHello"  value ="Hello"  onclick ="btnHello_onclick()"   />
    
</ p >
    
< div  id ="result"   />

    
< script  type ="text/javascript" >
        
// defaultSucceededCallback - 调用成功的回调函数
        Hello.set_defaultSucceededCallback(onSucceeded);
        
// defaultFailedCallback - 调用失败的回调函数
        Hello.set_defaultFailedCallback(onFailed);
        
// defaultUserContext - 用户上下文
        Hello.set_defaultUserContext("webabcd");
        
// path - WebService的路径
        alert(Hello.get_path());
        
// timeout - 超时时间
        alert(Hello.get_timeout());
    
        
function btnHello_onclick() 
        
{
            
var name = $get("txtName").value;
            Hello.Say(name);
        }


        
function onSucceeded(result, context, methodName) 
        
{
            $get(
"result").innerHTML = result + "<br />";
            $get(
"result").innerHTML += "默认的Context:" + context + "<br />";
            $get(
"result").innerHTML += "调用的方法名:" + methodName + "<br />";
        }

        
        
function onFailed(error) 
        
{
            $get(
"result").innerHTML = error.get_message() + "<br />";
        }

    
</ script >

</ asp:Content >

运行结果
1、页面加载
弹出框,信息:/Web/WebService/Hello.asmx
弹出框,信息:0

2、单击“Hello”按钮
WebService Hello webabcd
默认的Context:webabcd
调用的方法名:Say


WebServiceProxy.aspx
<% @ Page Language="C#" MasterPageFile="~/Site.master" Title="WebServiceProxy Class"  %>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="ContentPlaceHolder1"  runat ="Server" >
    
< p >
        var webRequest = Sys.Net.WebServiceProxy.invoke(path, methodName, useHttpGet, parameters,
        succeededCallback, failedCallback, userContext, timeout);
    
</ p >
    
< ul >
        
< li > path - WebService的url  </ li >
        
< li > methodName - 调用的方法名  </ li >
        
< li > useHttpGet - 是否使用HTTP GET方式  </ li >
        
< li > parameters - 参数(示例:{"param1":196610, "param2":"Hello"})  </ li >
        
< li > succeededCallback - 调用成功的回调函数  </ li >
        
< li > failedCallback - 调用失败的回调函数  </ li >
        
< li > userContext - 用户上下文  </ li >
        
< li > timeout - 超时时间  </ li >
        
< li > 返回值 - 相关的WebRequest对象  </ li >
    
</ ul >
    
< input  type ="button"  id ="btnHello"  value ="Hello"  onclick ="btnHello_onclick()"   />
    
< br  />
    
< br  />
    
< div  id ="result"   />

    
< script  type ="text/javascript" >
        
function btnHello_onclick()
        
{
            
var wRequest = 
            Sys.Net.WebServiceProxy.invoke
            (
                
"Hello.asmx",
                
"Say",
                
false,
                
{"name":'webabcd'},
                onSucceeded,
                
null,
                
null,
                
-1
            );
            
            $get(
"result").innerHTML = wRequest.get_body() + "<br />";
        }

        
        
function onSucceeded(result)
        
{
            $get(
"result").innerHTML += result + "<br />";
        }

    
</ script >

</ asp:Content >

运行结果
1、单击“Hello”按钮
{"name":"webabcd"}
WebService Hello webabcd


OK
[源码下载]
[ScriptService] 特性的 Web 服务才能从脚本中调用 仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用。 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 仅在类定义上有 [ScriptService] 特性的 Web 服务才能从脚本中调用。 立即下载

相关推荐

WebService介绍(三):使用WebService代理类

WebService介绍(三):使用WebService代理类

最近写 ASP.NET 中出现的错误 & 实现DataTable和DataSet类型的客户端/服务器端自动转换...

CausesValidation 属性设置:未设置为 False 而导致 Ajax 回调时无反应,或设置了 True 而导致即使输入不合要求也提交后台处理(在无 Submit Button 情况下) 客户端调用 WebService ,其中 WebService 返回的是 DataSet 对象 :出现错误提示“WebMethod Dataset System.InvalidOperat...

bajiu8387的博客 193

保姆级教程:在Ubuntu 21.04上搞定USRP X410的UHD 4.1驱动与Gnuradio 3.9安装(含虚拟机网络避坑指南)

本文提供在Ubuntu 21.04上配置USRP X410的UHD 4.1驱动与Gnuradio 3.9的详细教程,涵盖虚拟机网络设置、依赖安装、源码编译及常见问题解决方案,帮助开发者高效搭建SDR开发环境。

weixin_27869497的博客 272

.Net中 WebService的两种实现方式

WebService详解 和.Net中 WebService的两种实现方式

Ryangfeng 2909

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.csdn.net/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

【python】import pandas as pd用法

是 Python 里最常用的数据分析库之一。 的意思是:导入 pandas 库,并给它起个别名 。这样用起来更简洁: 下面总结 pandas 的常见用法(配例子)。目录🔹 1. 数据结构(1) Series(一维数据,类似于数组 + 标签)(2) DataFrame(二维数据表,类似于 Excel 表格)🔹 2. 数据读写🔹 3. 数据查看🔹 4. 数据选择与索引🔹 5. 数据清洗🔹 6. 数据运算🔹 7. 数据筛选(布尔索引)🔹 8. 分组与聚合🔹 9. 排序 Pandas 常用方

2401_86285609的博客 1531

ystem.Web.Script.Services.ScriptService 引用的问题

System.Web.Script.Services.ScriptService] 这个命名空间是不是只有安装了 AJAX 扩展才能有???vs2008中有System.Web.Script.Services命名空间. 应该是装了 AJAX  扩展才能有vs2005 打System.Web.Extensions  和 System.Web.Extensions.Design即可

2004v2004的专栏 2174

从‘全步’到‘微步’:一张图看懂步进电机细分控制,选对模式让你的项目更丝滑

本文深入解析步进电机细分控制技术,从全步到微步的演进过程,帮助工程师根据项目需求选择最优控制模式。通过对比不同细分等级的性能特点和应用场景,提供3D打印、实验室自动化等领域的黄金配置方案,实现更精准、平稳的电机控制效果。

weixin_29290259的博客 471

C#调用WebService服务(动态调用)

1 创建WebService [csharp] view plaincopy using System;   using System.Web.Services;      namespace WebService1   {       ///        /// Service1 的摘要说明       ///        

dragon_ton的专栏 891

手把手教你用HarmBench数据集测试大模型安全性(含多模态案例)

本文详细介绍了如何使用HarmBench数据集测试大模型的安全性,包括文本和多模态越狱指令的实战案例。通过环境配置、数据集获取、测试流程及结果分析,帮助开发者全面评估和提升大模型的安全防护能力,特别关注多模态攻击的防御策略。

weixin_26642481的博客 323

100个Python实战项目(七)实现摩斯密码翻译器

作者主页:海拥 作者简介:优快云全栈领域优质创作者、HDZ核心组成员、蝉联C站周榜前十 粉丝福利:往期获奖记录 每周送6~9本书,不定期送各种小礼品(搪瓷杯、抱枕、鼠标垫、马克杯等) 摩斯密码是一种将文本信息作为一系列通断的音调、灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译。它以电报发明者Samuel F. B. Morse的名字命名。 算法 算法非常简单。英语中的每个字符都被一系列“点”和“破折号”代替,或者有时只是单数的“点”或“

努力是为了站在万人之中,成为别人的光 1万+

系统地学习ASP.NET AJAX(9) - 客户端脚本编程(Sys.Net命名空间下的WebServiceProxy、WebServiceError、Generated Proxy Classes以...

     摘要: 使用ASP.NET AJAX调用WebService(简单类型和复杂对象、JSON和XML)和PageMethod。Sys.Net命名空间下的WebServiceProxy Class、WebServiceError Class、Generated Proxy Classes  阅读全文webabcd 2007-07-05 09:18 发表评论...

yanhuanwang 109

SAP-ABAP:SAP基础数据校验工具开发系列博客(共5篇) 第一篇:需求梳理与架构设计:从零搭建SAP主数据校验能力底座

摘要: 本系列博客介绍SAP主数据校验工具的开发和设计,旨在解决物料、供应商、客户等主数据录入不规范、关联缺失和合规性问题。第一篇聚焦需求梳理与架构设计,提出分层技术架构(展示层、业务逻辑层、数据访问层),支持实时校验和批量校验两种模式,并详细说明规则引擎设计、SAP系统对接方案及权限管控逻辑。后续篇章将深入规则引擎实现、接口对接、结果可视化和性能优化,帮助构建集中式、可配置的主数据校验能力,提升SAP数据质量。

baidu_35680696的博客 330

找不到System.Web.Script.Services.ScriptService

以为要引用什么东西,试了几个都不成。改框架为.net3.5就没问题了,编译通过。 方法是:网站项目的右键->属性页->生成 在右侧的“目标 Framework(F)”,选择.net framework 3.5。 试了一个ScriptManager控件,真是厉害,自己写的JS的很多方法都能代码提示,并自动完成。VS.net2008真让人兴奋! 转载于:https://ww...

weixin_30682127的博客 186

YOLO11实战优化:长尾分布解决 | 引入Seesaw Loss配合YOLO11分类头,完美应对类别极其不平衡的现实业务场景

摘要: YOLO11在工业缺陷检测等长尾分布场景中面临尾部类别检测失效的问题,根源在于头部类别样本的负样本梯度压制了尾部类别的学习。传统方法如重采样、Focal Loss等效果有限。Seesaw Loss通过动态调整缓解因子和补偿因子,平衡类别间的梯度分布,结合YOLO11的解耦分类头、Anchor-Free设计和C2PSA/C3K2模块,显著提升尾部类别识别能力。文章详细解析了Seesaw Loss的数学原理,并提供了可直接集成到YOLO11的PyTorch实现代码,为长尾分布下的目标检测提供了实用解决方

2601_95807009的博客 252

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ABPVnext创建项目排坑2

分层项目无法使用动态JS代理 解决方法: Include the proxy script in the web page: <script src="https://localhost:<api-host-port>/Abp/ServiceProxyScript"></script> In the web project, setabp.appPathto the http api host's base url in Javascript. E..

扶强的专栏 1654

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WebServiceProxy---反射调用方法

/// <summary> /// WebServiceProxy 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.Basic...

weixin_38168728的博客 776

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

$.ajax 参数 context 方法done

$.ajax({         url: "url",         context: document.body     }).done(function() {                                  $(this).addClass( "done" );                               console.dir($(thi

思祁阁 2307

JQuery _ AJAX 记录

定义和用法 ajax() 方法通过 HTTP 请求加载远程数据。 该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。 最简单的情况下,$.ajax() 可以不带任何参数直接使用。 ...

永不止步 1083

Sys.Net.WebServiceFailedException:服务器方法"GetData"失败

Sys.Net.WebServiceFailedException:服务器方法"GetData"失败  (2011-07-11 16:12:38)有天突然看到有人说文件夹的命名问题。最好不要用中文命名。    这个问题困扰了我很久。一直没找到解决办法。在网上搜寻结果也都没找到解决办法。郁闷了好久。     我一看我的文件夹是中文的。马上改成英文再调试。呵,居然调试成功了。高兴了一把。 同时也...

ldweifengxix的博客 596

C#使用WebProxy实现代理访问webservice

1.问题描述 标题写的有点含糊不清,不好意思语言表达能力欠佳。。事情是这样的! 事情是这样的,在A服务器上有一个webservice,B计算机和C计算机都可以ping通A服务器,但是C计算机的ip备案了而B计算机的ip没有备案,导致我写的一个小程序放在B计算机上调用A服务器的webservice的时候提示我ip非法。 那么该如何让这个小程序能在B计算机上正常使用呢?答案是代理服务器! 2. w...

cgs的博客 3671

webservice客户端命名空间

一:开发背景webservice通讯时经常会遇到命名空间不符的情况,比如全系统统一使用一套规范,但是某些系统提供的服务命名不是很统一,由其提供的wsdl文件生成的客户端的命名空间也随之不统一,因此就需要调用方开发客户端时修改命名空间。1:全系统统一使用的命名空间&lt;soapenv:envelope xmlns:soapenv="http://shcemas.xnlsoap.org/soap/e...

小熊来了 2万+
上一篇: [翻译]在SQL Server中使用CLR调用.NET方法
下一篇: [翻译]在Visual Studio 2005中调试SQL Server 2005的存储过程
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值