VS2012 + .net 4.0 + WebService + Jquery 1.9.1 + ajax亲测不坑爹例子
这个测试内容比较复杂,按照以下步骤去做,对于老手来说,可能也需要半个小时左右。有任何问题,请加QQ群讨论:23152359
最终效果图:
步骤:
1.建立项目。
文件 -> 新建 -> 项目 -> 模板/Visual C#/Web/ASP.Net 空Web 应用程序,我用的是.net 4.0,在.net 4.5应该也一样。假设工程名字为 WebApplication3
2.增加WebService
解决方案资源管理器 -> 鼠标左键单击选中 WebApplication3 -> 对WebApplication3单击鼠标右键,在弹出的菜单中选择:添加 -> 新建项 -> Visual C#/Web/Web 服务 ,名称填 WebService1.asmx(默认就是这个名字) -> 添加
3.修改WebService1.asmx
上一步,添加后,会自动打开 WebService1.asmx.cs
3.1 看到这两行没?
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService]
把 [System.Web.Script.Services.ScriptService] 前面的注释删掉。
3.2 把WebService1.asmx.cs,修改为:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6 using System.Diagnostics; 7 8 namespace WebApplication3 9 { 10 /// <summary> 11 /// WebService1 的摘要说明 12 /// </summary> 13 [WebService(Namespace = "http://tempuri.org/")] 14 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 15 [System.ComponentModel.ToolboxItem(false)] 16 // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 17 [System.Web.Script.Services.ScriptService] 18 public class WebService1 : System.Web.Services.WebService 19 { 20 21 [WebMethod] 22 public string HelloWorld()//不管这个 23 { 24 return "Hello World"; 25 } 26 27 [WebMethod] 28 public void Test1_NoArg_NoReturn()//测试1:无参数,无返回 29 { 30 Debugger.Log(0, "", "Test1_NoArg_NoReturn被调用!!\r\n");//记得在调试时,打开输出面板,才能看到这句话。打开方法:在调试时,菜单 -> 视图 -> 输出 31 return; 32 } 33 34 [WebMethod] 35 public int Test2_NoArg_ReturnS1()//测试2:无参数,有返回(简单类型_单个) 36 { 37 return ((new Random()).Next()); 38 } 39 40 [WebMethod] 41 public int[] Test3_ArgS1_ReturnSN(int arg_firstNumber)//测试3:有参数(简单类型_单个),有返回(简单类型_多个) 42 { 43 int[] intArray = new int[] { arg_firstNumber, (new Random()).Next(), (new Random()).Next(), (new Random()).Next(), (new Random()).Next() }; 44 return intArray; 45 } 46 47 [WebMethod] 48 public Class_C Test4_ArgSN_ReturnC1(int[] arg_intValueArray)//测试4:有参数(简单类型_多个),有返回(复杂类型_单个) 49 { 50 Class_C result = new Class_C(); 51 result.ID = arg_intValueArray.Length; 52 result.Name = "参数数量:" + result.ID.ToString() + "个"; 53 result.IntArray = new int[arg_intValueArray.Length]; 54 result.StringArray = new string[arg_intValueArray.Length]; 55 for (int i = 0; i < arg_intValueArray.Length; i++) 56 { 57 result.IntArray[i] = arg_intValueArray[i]; 58 result.StringArray[i] = "StringMode:" + arg_intValueArray[i].ToString(); 59 } 60 return result; 61 } 62 63 [WebMethod] 64 public Class_C[] Test5_ArgC1_ReturnCN(Class_C arg_value)//测试5:有参数(复杂类型_单个), 有返回(复杂类型_多个) 65 { 66 Class_C[] resultArray = new Class_C[arg_value.IntArray.Length]; 67 for (int i = 0; i < arg_value.IntArray.Length; i++) 68 { 69 resultArray[i] = new Class_C(); 70 resultArray[i].ID = i + 1; 71 resultArray[i].Name = "ID : " + resultArray[i].ID; 72 resultArray[i].IntArray = new int[]{1,2,3,4,5}; 73 resultArray[i].StringArray = new string[]{"1", "2", "3", "4", "5"}; 74 } 75 return resultArray; 76 } 77 78 [WebMethod] 79 public Class_X Test6_ArgCN_ReturnX1(Class_C[] arg_array)//测试6:有参数(复杂类型_多个), 有返回(复合类型_单个) 80 { 81 Class_X result = new Class_X(); 82 result.ID = arg_array.Length; 83 result.Name = "Name : " + result.ID.ToString(); 84 int[] intArray = new int[arg_array.Length]; 85 string[] stringArray = new string[arg_array.Length]; 86 for (int i = 0; i < arg_array.Length; i++) 87 { 88 intArray[i] = arg_array[i].ID; 89 stringArray[i] = arg_array[i].Name; 90 } 91 result.IntArray = intArray; 92 result.StringArray = stringArray; 93 result.Data = new Class_C(); 94 result.Data.ID = result.ID + 1; 95 result.Data.Name = "Result.Data : " + result.Data.ID.ToString(); 96 result.Data.IntArray = result.IntArray.Clone() as int[]; 97 result.Data.StringArray = result.StringArray.Clone() as string[]; 98 return result; 99 } 100 101 [WebMethod] 102 public Class_X[] Test7_ArgX1_ReturnXN(Class_X arg_value)//测试7:有参数(复合类型_单个), 有返回(复合类型_多个) 103 { 104 Class_X[] resultArray = new Class_X[arg_value.ID]; 105 for (int i = 0; i < resultArray.Length; i++) 106 { 107 resultArray[i] = new Class_X(); 108 resultArray[i].ID = i + 1; 109 resultArray[i].Name = "Name : " + resultArray[i].ID.ToString(); 110 int[] intArray = new int[arg_value.ID]; 111 string[] stringArray = new string[arg_value.ID]; 112 for (int j = 0; j < arg_value.ID; j++) 113 { 114 intArray[j] = j + 1; 115 stringArray[j] = "ArrayMode : " + intArray[j].ToString(); 116 } 117 resultArray[i].IntArray = intArray; 118 resultArray[i].StringArray = stringArray; 119 resultArray[i].Data = new Class_C(); 120 resultArray[i].Data.ID = resultArray[i].ID + 1; 121 resultArray[i].Data.Name = "Result.Data : " + resultArray[i].Data.ID.ToString(); 122 resultArray[i].Data.IntArray = resultArray[i].IntArray.Clone() as int[]; 123 resultArray[i].Data.StringArray = resultArray[i].StringArray.Clone() as string[]; 124 } 125 return resultArray; 126 } 127 128 [WebMethod] 129 public void Test8_ArgXN_NoReturn(Class_X[] arg_array)//测试8:有参数(复合类型_多个),无返回 130 { 131 Debugger.Log(0, "", "Test8_ArgXN_NoReturn:arg_array.Length = " + arg_array.Length.ToString() + "\r\n"); 132 } 133 134 [WebMethod] 135 public void Test9_ArgMixAll_NoReturn(int arg_intValue, string arg_stringValue, Class_C arg_C1Value, Class_C[] arg_CNValue, Class_X arg_X1Value, Class_X[] arg_XNValue)//测试9:有参数(多个不同类型的参数),无返回 136 { 137 Debugger.Log(0, "", "Test9_ArgMixAll_NoReturn:Use Breakpoint\r\n"); 138 } 139 } 140 141 [Serializable] 142 public class Class_C 143 { 144 public int ID { get; set; } 145 public string Name { get; set; } 146 public int[] IntArray { get; set; } 147 public string[] StringArray { get; set; } 148 } 149 150 [Serializable] 151 public class Class_X 152 { 153 public int ID { get; set; } 154 public string Name { get; set; } 155 public Class_C Data { get; set; } 156 public int[] IntArray { get; set; } 157 public string[] StringArray { get; set; } 158 } 159 }
4.去jquery官网,下载jquery-1.9.1.min.js,然后拖动到解决方案资源管理器的WebApplication3的目录下。拖动后,jquery-1.9.1.min.js应该与Web.config、WebService1.asmx在同一层次。
5.增加测试用网页
解决方案资源管理器 -> 鼠标左键单击选中 WebApplication3 -> 对WebApplication3单击鼠标右键,在弹出的菜单中选择:添加 -> 新建项 -> Visual C#/Web/HTML 页 ,名称填 HtmlPage1.html(默认就是这个名字) -> 添加
然后把HtmlPage1.html的内容,修改为:
1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6 <style type="text/css"> 7 #WebUI_Output { 8 height: 410px; 9 width: 1050px; 10 } 11 </style> 12 <script type="text/javascript" src="jquery-1.9.1.min.js"></script> 13 <script type="text/javascript" src="JavaScript.js"></script> 14 </head> 15 <body> 16 <div> 17 <textarea id="WebUI_Output"></textarea> 18 <br /> 19 <input type="button" value="Test1_NoArg_NoReturn" onclick="Event__Test1_NoArg_NoReturn()"/> 20 <br /> 21 <input type="button" value="Test2_NoArg_ReturnS1" onclick="Event__Test2_NoArg_ReturnS1()"/> 22 <br /> 23 <input type="button" value="Test3_ArgS1_ReturnSN" onclick="Event__Test3_ArgS1_ReturnSN()"/> 24 <br /> 25 <input type="button" value="Test4_ArgSN_ReturnC1" onclick="Event__Test4_ArgSN_ReturnC1()"/> 26 <br /> 27 <input type="button" value="Test5_ArgC1_ReturnCN" onclick="Event__Test5_ArgC1_ReturnCN()"/> 28 <br /> 29 <input type="button" value="Test6_ArgCN_ReturnX1" onclick="Event__Test6_ArgCN_ReturnX1()"/> 30 <br /> 31 <input type="button" value="Test7_ArgX1_ReturnXN" onclick="Event__Test7_ArgX1_ReturnXN()"/> 32 <br /> 33 <input type="button" value="Test8_ArgXN_NoReturn" onclick="Event__Test8_ArgXN_NoReturn()"/> 34 <br /> 35 <input type="button" value="Test9_ArgMixAll_NoReturn" onclick="Event__Test9_ArgMixAll_NoReturn()"/> 36 </div> 37 </body> 38 </html>
最后,在解决方案资源管理器里,对 HtmlPage1.html 单击鼠标右键,选“设为起始页”。
6.增加测试用JS文件
解决方案资源管理器 -> 鼠标左键单击选中 WebApplication3 -> 对WebApplication3单击鼠标右键,在弹出的菜单中选择:添加 -> 新建项 -> Visual C#/Web/JavaScript 文件 ,名称填 JavaScript.js -> 添加
然后把JavaScript.js的内容,修改为:
1 var Global_Config_URL = "/WebService1.asmx/"; 2 var Global_Counter = 0; 3 4 function Output( arg_msg ) 5 { 6 arg_msg = arg_msg.replace(/\\r\\n/g, "\r\n"); 7 Global_Counter++; 8 $("#WebUI_Output").text("【" + Global_Counter.toString() + "】 " + arg_msg); 9 } 10 11 function OutputError(arg_errorMsg) 12 { 13 Output("遇到错误:" + arg_errorMsg); 14 } 15 16 function Event__Test1_NoArg_NoReturn() 17 { 18 var actionName = "Test1_NoArg_NoReturn"; 19 var options = 20 { 21 type: "POST", 22 url: Global_Config_URL + actionName, 23 contentType: "application/json; charset=utf-8", 24 error: function (jqXHR, errorType, errorMsg) 25 { 26 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 27 }, 28 success: function (result, textArgs, jqXHRArg) 29 { 30 Output("调用成功"); 31 } 32 } 33 $.ajax(options) 34 } 35 36 function Event__Test2_NoArg_ReturnS1() 37 { 38 var actionName = "Test2_NoArg_ReturnS1"; 39 var options = 40 { 41 type: "POST", 42 url: Global_Config_URL + actionName, 43 contentType: "application/json; charset=utf-8", 44 error: function (jqXHR, errorType, errorMsg) 45 { 46 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 47 }, 48 success: function (result, textArgs, jqXHRArg) 49 { 50 Output("返回随机Int值:" + result.d); 51 } 52 } 53 $.ajax(options) 54 } 55 56 function Event__Test3_ArgS1_ReturnSN() 57 { 58 var actionName = "Test3_ArgS1_ReturnSN"; 59 var arg_firstNumber = parseInt(Math.random() * 2100000000); 60 var arg_dataMode = "{ arg_firstNumber: " + arg_firstNumber.toString() + " }"; 61 var options = 62 { 63 type: "POST", 64 url: Global_Config_URL + actionName, 65 contentType: "application/json; charset=utf-8", 66 dataType: "json", 67 data: arg_dataMode, 68 error: function (jqXHR, errorType, errorMsg) 69 { 70 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 71 }, 72 success: function (result, textArgs, jqXHRArg) 73 { 74 Output("返回Int随机数组:" + result.d); 75 } 76 } 77 $.ajax(options) 78 } 79 80 function Event__Test4_ArgSN_ReturnC1() 81 { 82 var actionName = "Test4_ArgSN_ReturnC1"; 83 var arg_randomNumberArray = []; 84 var arg_randomNumberArray_Length = 5; 85 for (var i = 0; i < arg_randomNumberArray_Length; i++) 86 { 87 88 arg_randomNumberArray.push(parseInt(Math.random() * 2100000000)); 89 } 90 var arg_dataMode = ""; 91 for (var i = 0; i < arg_randomNumberArray_Length; i++) 92 { 93 if( i == 0 ) 94 { 95 arg_dataMode += "{ arg_intValueArray : [ "; 96 } 97 arg_dataMode += arg_randomNumberArray[i].toString(); 98 if ( i != arg_randomNumberArray_Length - 1 ) 99 { 100 arg_dataMode += ", "; 101 } 102 else 103 { 104 arg_dataMode += " ] }"; 105 } 106 } 107 var options = 108 { 109 type: "POST", 110 url: Global_Config_URL + actionName, 111 contentType: "application/json; charset=utf-8", 112 dataType: "json", 113 data: arg_dataMode, 114 error: function (jqXHR, errorType, errorMsg) 115 { 116 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 117 }, 118 success: function (result, textArgs, jqXHRArg) 119 { 120 var debugMode_Result = result.d;//在这里下断点,来查看返回值。 121 Output("返回Class_C:具体数据请在JavaScript.js里通过Debug查看。"); 122 } 123 } 124 $.ajax(options) 125 } 126 127 function Event__Test5_ArgC1_ReturnCN() 128 { 129 var actionName = "Test5_ArgC1_ReturnCN"; 130 var arg_dataMode = "{ arg_value : { ID : 199, Name : 'Name 199', IntArray : [ 2, 4, 8, 256, 1024 ], StringArray : [ 'StringMode:2', 'StringMode:4', 'StringMode:8', 'StringMode:256', 'StringMode:1024' ] } }"; 131 var options = 132 { 133 type: "POST", 134 url: Global_Config_URL + actionName, 135 contentType: "application/json; charset=utf-8", 136 dataType: "json", 137 data: arg_dataMode, 138 error: function (jqXHR, errorType, errorMsg) 139 { 140 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 141 }, 142 success: function (result, textArgs, jqXHRArg) 143 { 144 var debugMode_Result = result.d;//在这里下断点,来查看返回值。 145 Output("返回Class_C[]:具体数据请在JavaScript.js里通过Debug查看。"); 146 } 147 } 148 $.ajax(options) 149 } 150 151 function Event__Test6_ArgCN_ReturnX1() 152 { 153 var actionName = "Test6_ArgCN_ReturnX1"; 154 var arg_dataMode = ""; 155 var arg_arrayLength = 5; 156 for (var i = 0; i < arg_arrayLength; i++) 157 { 158 if (i == 0) 159 { 160 arg_dataMode += "{ arg_array : [ "; 161 } 162 var currentDataMode = "{ ID : " + (i+1).toString() + ", Name : 'Name " + (i+1).toString() + "', IntArray : [ 2, 4, 8, 256, 1024 ], StringArray : [ 'StringMode:2', 'StringMode:4', 'StringMode:8', 'StringMode:256', 'StringMode:1024' ] }"; 163 arg_dataMode += currentDataMode; 164 if (i != arg_arrayLength - 1) 165 { 166 arg_dataMode += ", "; 167 } 168 else 169 { 170 arg_dataMode += " ] }"; 171 } 172 } 173 var options = 174 { 175 type: "POST", 176 url: Global_Config_URL + actionName, 177 contentType: "application/json; charset=utf-8", 178 dataType: "json", 179 data: arg_dataMode, 180 error: function (jqXHR, errorType, errorMsg) 181 { 182 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 183 }, 184 success: function (result, textArgs, jqXHRArg) 185 { 186 var debugMode_Result = result.d;//在这里下断点,来查看返回值。 187 Output("返回Class_X:具体数据请在JavaScript.js里通过Debug查看。"); 188 } 189 } 190 $.ajax(options) 191 } 192 193 function Event__Test7_ArgX1_ReturnXN() 194 { 195 var actionName = "Test7_ArgX1_ReturnXN"; 196 var arg_dataMode = "{ arg_value : { ID : 399, Name : 'Name : 399', IntArray : [ 2, 4, 8, 128, 256 ], StringArray : [ 'StringMode:2', 'StringMode:4', 'StringMode:8', 'StringMode:128', 'StringMode:256' ] } }"; 197 var options = 198 { 199 type: "POST", 200 url: Global_Config_URL + actionName, 201 contentType: "application/json; charset=utf-8", 202 dataType: "json", 203 data: arg_dataMode, 204 error: function (jqXHR, errorType, errorMsg) 205 { 206 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 207 }, 208 success: function (result, textArgs, jqXHRArg) 209 { 210 var debugMode_Result = result.d;//在这里下断点,来查看返回值。 211 Output("返回Class_X[]:具体数据请在JavaScript.js里通过Debug查看。"); 212 } 213 } 214 $.ajax(options) 215 } 216 217 function Event__Test8_ArgXN_NoReturn() 218 { 219 var actionName = "Test8_ArgXN_NoReturn"; 220 var arg_dataMode = ""; 221 var arg_arrayLength = 5; 222 for (var i = 0; i < arg_arrayLength; i++) 223 { 224 if (i == 0) 225 { 226 arg_dataMode += "{ arg_array : [ "; 227 } 228 var currentDataMode = "{ ID: " + (i + 1).toString() + ", Name: 'Name : " + (i + 1).toString() + "', IntArray: [2, 4, 8, 128, 256], StringArray: ['StringMode:2', 'StringMode:4', 'StringMode:8', 'StringMode:128', 'StringMode:256'] }"; 229 arg_dataMode += currentDataMode; 230 if (i != arg_arrayLength - 1) 231 { 232 arg_dataMode += ", "; 233 } 234 else 235 { 236 arg_dataMode += " ] }"; 237 } 238 } 239 var options = 240 { 241 type: "POST", 242 url: Global_Config_URL + actionName, 243 contentType: "application/json; charset=utf-8", 244 dataType: "json", 245 data: arg_dataMode, 246 error: function (jqXHR, errorType, errorMsg) 247 { 248 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 249 }, 250 success: function (result, textArgs, jqXHRArg) 251 { 252 Output("调用成功"); 253 } 254 } 255 $.ajax(options) 256 } 257 258 function Event__Test9_ArgMixAll_NoReturn() 259 { 260 var actionName = "Test9_ArgMixAll_NoReturn"; 261 var arg_dataMode = ""; 262 //1.arg: intValue 263 var arg_intValue = "arg_intValue : 12345"; 264 //2.arg: stringValue 265 var arg_stringValue = "arg_stringValue : 'StringMode:12345'"; 266 //3.arg: Class_C C1Value 267 var arg_C1Value = "arg_C1Value : { ID : 900, Name : 'Name : 900', IntArray : [ 1, 2, 3, 4, 5 ], StringArray : [ 'StringMode:1', 'StringMode:2', 'StringMode:3', 'StringMode:4', 'StringMode:5' ] }"; 268 //4.arg: Class_C[] CNValue 269 var arg_CNValue = ""; 270 var arg_CNValueLength = 5; 271 for (var i = 0; i < arg_CNValueLength; i++) 272 { 273 if (i == 0) 274 { 275 arg_CNValue += "arg_CNValue : [ "; 276 } 277 var currentC1Value = "{ ID : " + (i + 1).toString() + ", Name : 'Name : " + (i + 1).toString() + "', IntArray : [ 4, 5, 6, 7, 8 ], StringArray : [ 'StringMode:4', 'StringMode:5', 'StringMode:6', 'StringMode:7', 'StringMode:8' ] }"; 278 arg_CNValue += currentC1Value; 279 if (i != arg_CNValueLength - 1) 280 { 281 arg_CNValue += ", "; 282 } 283 else 284 { 285 arg_CNValue += " ]"; 286 } 287 } 288 //5.arg: Class_X X1Value 289 var arg_X1Value = "arg_X1Value : { ID : 399, Name : 'Name : 399', IntArray : [ 2, 4, 8, 128, 256 ], StringArray : [ 'StringMode:2', 'StringMode:4', 'StringMode:8', 'StringMode:128', 'StringMode:256' ] }"; 290 //6.arg: Class_X[] XNValue 291 var arg_XNValue = ""; 292 var arg_XNValueLength = 5; 293 for (var i = 0; i < arg_XNValueLength; i++) 294 { 295 if (i == 0) 296 { 297 arg_XNValue += "arg_XNValue : [ "; 298 } 299 var currentX1Value = "{ ID: " + (i + 1).toString() + ", Name: 'Name : " + (i + 1).toString() + "', IntArray: [2, 4, 8, 128, 256], StringArray: ['StringMode:2', 'StringMode:4', 'StringMode:8', 'StringMode:128', 'StringMode:256'] }"; 300 arg_XNValue += currentX1Value; 301 if (i != arg_XNValueLength - 1) 302 { 303 arg_XNValue += ", "; 304 } 305 else 306 { 307 arg_XNValue += " ]"; 308 } 309 } 310 //Mix ALL 311 arg_dataMode += "{ " + arg_intValue + ", " + arg_stringValue + ", " + arg_C1Value + ", " + arg_CNValue + ", " + arg_X1Value + ", " + arg_XNValue + " }"; 312 var options = 313 { 314 type: "POST", 315 url: Global_Config_URL + actionName, 316 contentType: "application/json; charset=utf-8", 317 dataType: "json", 318 data: arg_dataMode, 319 error: function (jqXHR, errorType, errorMsg) 320 { 321 OutputError(errorMsg + ",详细信息:" + jqXHR.responseText); 322 }, 323 success: function (result, textArgs, jqXHRArg) 324 { 325 Output("调用成功"); 326 } 327 } 328 $.ajax(options) 329 }
7.修改Web配置文件
由于测试方法中,有部分方法,从服务端返回到客户端的数据量比较大,因此需要修改一下默认Web配置文件,否则会报错说超过最大长度。
解决方案资源管理器 -> 鼠标左键双击 Web.config,然后把Web.config的内容,修改为:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <!-- 4 有关如何配置 ASP.NET 应用程序的详细信息,请访问 5 http://go.microsoft.com/fwlink/?LinkId=169433 6 --> 7 8 <configuration> 9 <system.web> 10 <compilation debug="true" targetFramework="4.0" /> 11 </system.web> 12 <system.web.extensions> 13 <scripting> 14 <webServices> 15 <jsonSerialization maxJsonLength="2100000000" /> 16 </webServices> 17 </scripting> 18 </system.web.extensions> 19 </configuration>
8.现在,就可以在VS2012里进行调试了。
解决方案资源管理器 -> 鼠标左键单击选中 HtmlPage1.html,然后按F5开始调试。有些功能,需要在WebService1.asmx或JavaScript.js里的对应位置,下断点来查看数据信息,具体信息请看提示。