Web Service和网页的相似之处在上一章提到过,这里总结一下:
1。由公共语言运行时完全实现,包括面向对象的架构、所有基类以及缓存、状态和数据访问等功能
2。几乎相同的文件和代码结构
3。所有源代码文件都是纯文本
4。 vs完全支持,可以使用vs进行非常方便的编辑和调试
5。使用基于纯文本的配置文件和VS的网站管理工具进行全局或应用程序级配置。
Web Service没有接口,只有方法,有些东西可以从客户端远程调用。 Web服务文件的后缀是asmx。
首次运行Web Service应用时,如果手动编译Web Service并将其放置在虚拟目录的bin目录下,那么代码隐藏对于内联编码有性能优势,因为asmx文件位于Web Service在运行时会被编译成一个类。 www.gsm-guard.net 2.0默认情况下不具备这个优势,因为www.gsm-guard.net 2.0将源代码放在App_Code目录中,并在第一次使用时进行编译。
下面是一个例子(库存追踪,没有使用数据库,只是为了演示,所以使用了二维数组)
此 Web 服务提供两种方法:
GetName:参数为StcokSymbol对象,返回内容为股票名称的字符串
GetPrice:参数是StcokSymbol对象,返回代表当前股票价格的数字
我用的是vs2010,
首先新建一个项目(WebSite也可以),注意选择.NET Framework 3.5,默认4没有Web Service选项。选择www.gsm-guard.net Web Service Application,命名为StockWebService,如图
我们可以看到vs自动为我们生成了一些代码:
///
/// Service1 的摘要描述
///
[WebService(命名空间 = "http://www.gsm-guard.net/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 要允许使用 www.gsm-guard.net AJAX 从脚本调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
公共类 Service1 :System.Web.Services.WebService
{
[WebMethod]
公共字符串 HelloWorld()
{
返回“Hello World”;
}
}
在 Service 类中,有一个名为 HelloWorld 的模板方法,它将返回一个字符串。该方法用 WebMethod 属性修饰,表明该方法可供 Web Service 用户使用。 WebMethod 功能将在稍后解释。
?
按F5运行程序,可以看到如图
添加以下方法
[WebMethod]
public double GetPrice(string stockSymbol)
{
for (int i = 0; i { if (string.Compare(stockSymbol,stocks[i, 0], true) == 0) return Convert.ToDouble(stocks[i, 2]); } 返回0; } [WebMethod] 公共字符串 GetName(string stockSymbol) { for (int i = 0; i { if (string.Compare(stockSymbol,stocks[i, 0], true) == 0) 返回股票[i, 1]; } 返回“未找到符号。”; } 重新运行项目,发现多了两个方法调用的入口。 ? Web 服务命令 普通.aspx文件使用Page指令作为第一行代码,而Web Service有一条WebService指令(在vs中无法直接看到,可以找到Service1.asmx文件,右键编辑): <%@ WebService Language="C#" CodeBehind="Service1.asmx.cs" class="StockWebService.Service1" %> 语言:指定 Web 服务中使用的语言,非必需 类:指定 Web 服务的类名称,必填 CodeBehind:如果该类没有包含在Web Service文件的代码中,并且该类没有被手动编译并放置在bin子目录中,则WebService指令的CodeBehind属性用于指定该类的名称实现WebService类的源代码文件。 。 调试:如果设置为 true,则将在启用调试的情况下编译 Web 服务。默认为 false ?? 继承自WebService类 虽然它是可选的,但它有几个优点。主要优点是它可以访问 www.gsm-guard.net 中的几个常见对象: Application对象和Session对象(状态管理)、User对象(用于验证Web服务器调用者的身份)、Context对象(可以访问HttpContext类中调用者请求的所有特定HTTP信息) 当然,继承WebService类也是必要的,大概是为了克服.NET Framework的限制。 通过HttpContext控制应用程序状态 Web Service可以通过HttpContext控制Application对象(也可以访问所有www.gsm-guard.net资源) 示例:在Service1.asmx.cs中添加以下方法: /// /// 设置股票交换 /// /// [WebMethod] public void SetStockExchange(字符串交换) { 应用[“交换”] = 交换; } [WebMethod] 公共字符串 GetStockExchange() { return Application["exchange"].ToString(); } WebServiceBinding 功能 Web 服务描述语言 (WSDL) 定义的绑定可以用作 .NET 类访问 WebService 的接口。也就是说,绑定定义了一系列操作。 WebService 类具有默认绑定,其中包含该类的所有 Web 方法。此类与非默认绑定没有关联。 WebServiceBinding 属性用于标识非默认绑定。 WebService 类可以具有多个 WebServiceBinding 属性,每个属性都可以指定不同的绑定。如果省略 Name 属性,则该属性将指定默认绑定。 属性类型读写描述 ConformsToWsiProfiles╳╳WS-1 标准,绑定需要遵守 EmitConformanceClaimsBoolean╳╳如果为 true,当 WSDL 描述时,绑定会发出符合性声明 LocationString╳╳定义绑定的位置,默认value 当前 Web 服务 URL 的绑定名称 NamespaceString╳╳ NameString╳╳与绑定关联的命名空间 WebMethod 功能 网络服务是 Web 服务由 WebService 类定义。对于WebService类来说,没有必要向Web Service用户提供所有方法。需要提供的方法请: 1。宣布公开 2。在方法声明前设置WebMethod属性(即添加【Web Service】) WebMethod 包含一些用于设置 Web 方法行为的属性。语法:[WebMethod(PropertyName=value)],以下是部分属性的说明 BufferResponse:默认情况下,www.gsm-guard.net 在将整个响应从服务器发送到客户端之前缓存整个响应。在大多数情况下,这是最好的做法。但是,如果响应很长,则需要将其设置为 false 以禁用缓存。如果设置为 false,响应将以 16kb 块的形式返回给客户端。默认值为 true CacheDuration:和网页一样,Web Service也可以缓存返回给客户端的结果(有点:如果客户端发出的请求与另一个客户端发出的请求一模一样,那么服务器就会返回响应放在缓存中,可以提高性能)。 CacheDuration 定义第一个请求后多少秒将发送缓存页面以响应后续请求。一旦缓存过期,就会向请求发送新页面。默认值为 0,这会禁用结果缓存。如果web'方法返回的数据没有变化(例如:从每小时更新一次的数据库中检索数据的查询),那么可以将结果缓存设置为合适的时间,例如1800(30分钟) )。一方面,如果返回的数据是动态的,则需要将缓存持续时间设置得更短或完全禁用。如果Web Service没有相对有限的参数范围,则不适合使用缓冲。 Description:web方法的说明,字符串类型 EnableSession:默认为 false。如果设置为 true,Web 方法将启用会话状态。如果设置为 true 并且 Web Service 继承自 WebService 类,则会话可以使用 WebService.Session。允许会话状态会增加应用程序的额外开销。 MessageName:在C#类中,方法可以同名(重载),Web Service禁止使用重载。 WebMethod 属性的 MessageName 属性可以消除由多个相同名称引起的无法识别的问题。它允许为每个方法重载使用唯一的别名。当在 SOAP 消息中引用重载方法时,SOAP 消息将使用 MessageName 而不是方法的名称。 TransactionOption 属性:www.gsm-guard.net Web 方法可以使用事务,但仅限于在 Web 方法中初始化事件时。 TransactionOption 属性用于设置 Web 方法是否启动事务。但是,由于Web方法事务必须是根对象,因此只有两种不同的行为,启用新对象(Required、RequiresNew)或不启动它(Disabled、NotSupported、Supported)。如果在Web Service中启用事务,则需要: 1. 添加System.EnterpriseServices.dll引用; 2.添加命名空间(使用System.EnterpriseServices;); 3. 将 TransactionOption 属性添加到 WebMethod 属性并将其设置为Required(或RequiresNew) 转载于:https://www.gsm-guard.net/eart/archive/2011/05/30/2063855.html ? www.gsm-guard.net 上的 C++ 视频。 ?视频链接?链接,讲得还不错,有《Visual C++2008入门经典(中文高清版)》,有2010年的版本。 ?学习并做笔记。 1。引用 2.函数参数的默认值? 3。函数重载 4。内联函数 inline /**************************************************** ** /*bool类型命名空间输入输出 /*要求: /* 使用函数查找整数数组中的最大值或最小值 /**************************************************** ***/ #包括 #include 使用命名空间 std; int getMaxOrMin(int *arr, int arr_len, bool isMax); int main(void) { cout<<“嗨”< int arr1[5] = {2,5,6,4,9}; bool isMAx = false; cin >> isMAx; cout << getMaxOrMin(arr1, 5, isMAx) << endl; 系统(“暂停”); 返回0; } int getMaxOrMin(int *arr, int arr_len, bool isMax) { int temp = arr[0]; for (int i = 1; i < arr_len; i++) { if (isMax) { if (temp < arr[i])//获取最大值 { temp = arr[i]; } } 其他 { if (temp > arr[i])//获取分钟 { temp = arr[i]; } } } 返回温度; } 1 为Ture,求Max,值为9 0 为False,求Min,值为2 1。引用 引用是变量的别名。 引用在使用前必须初始化。 int a = 5; int &b = a; 指针类型引用?*&指针引用 = 指针; 引用的好处,左边是C语言方法,右边是C++引用方法。交换两个数字的值。 #包括 #包括 使用命名空间 std; int main(void) { //int a = 10; int &b = NULL; //引用,无实体。将会出现引用错误。 系统(“暂停”); 返回0; } /* 错误 1 错误 C2440:“初始化”:无法从“int”转换为“int &” e:\linbo\visual studio 2010\projects\test\test\test.cpp 9 1 测试 */ 参考,无实体。会出现引用错误。 c++中引用和指针有什么区别? ? ★ 相似点: ? 1、两者都是地址的概念; ? ?指针指向一块内存,其内容就是所指向内存的地址;引用是某一块内存的地址。别名。 ? ? ★ 差异: ? ? 1、指针是一个实体,而引用只是一个别名; ? ? 2、使用引用时不需要解引用(*),而指针需要解引用; ? ? 3. 引用只有在定义初始化一次后才能使用,此后不可变;指针是可变的;参考是“从一到最后”^_^? ? 4、引用没有const,指针有const,并且const指针是不可变的; ? 5.引用不能为空,指针可以为空; ? ? 6、“sizeof引用”获取指向的变量(对象)的大小,而“sizeof指针”获取指针本身的大小(指向的变量或对象的地址); ? ? 7.指针和引用的自增(++)操作的含义不同; 参考的一些规则如下: ? ? (1)引用在创建时必须初始化(指针可以随时初始化)。 ? ? (2) 不能有NULL引用,并且该引用必须关联合法的存储单元(指针可以为NULL)。 ? ? (3)引用一旦初始化,引用的关系就不能改变(指针可以随时改变它所指向的对象)。 2。函数参数默认值 有默认值的参数必须位于参数列表的右端。 fun (20) i = 20, j, k 为默认参数 fun (20, 30) 为:i=20, j=30, k 为默认值 乐趣 (20,30,40) 是:i=20, j=30, k=40 **************************************************** ****************************************************** ********************************************* 3。函数重载 同一函数的识别取决于参数类型、参数个数、参数顺序。 **************************************************** ****************************************************** ********************************************************* ** **************** 4。内联函数 inline 通常步骤 3 不会花很长时间,而步骤 1 和 2 则需要更长的时间。 一个内联函数,如下。它实际上扩展到下图。 上图中的功能其实是扩展了的。 fun (20) i = 20, j, k 为默认参数 fun (20, 30) 为:i=20, j=30, k 为默认值 乐趣 (20,30,40) 是:i=20, j=30, k=40 **************************************************** ************************** 函数参数重载 #包括 #包括 使用命名空间 std; void fun(int i = 15, int j = 30, int k = 20); int main(void) { 有趣(10); 乐趣(12,18); 乐趣(55,26,90); 系统(“暂停”); 返回0; } void fun(int i, int j, int k) { cout << "i:" << i << " j:" << j << " k:" << k << endl; } **************************************************** ************************* 函数重载 #包括 #包括 使用命名空间 std; void fun(int i = 15, int j = 30, int k = 20); 避免乐趣(双i,双j); int main(void) { 有趣(1.1,2.3); //void fun(double i , double j); fun(12,18);//void fun(int i = 15, int j = 30, int k = 20); 系统(“暂停”); 返回0; } void fun(int i, int j, int k) { cout << "i:" << i << " j:" << j << " k:" << k << endl; } 无乐趣(双i,双j) { cout << "i:" << i << "j:" << j << endl; } **************************************************** ************************** 内联 #包括 #包括 使用命名空间 std; 内联 void fun(int i = 15, int j = 30, int k = 20); 内联 void fun(双 i , 双 j); int main(void) { 有趣(1.1,2.3); //void fun(double i , double j); fun(12,18);//void fun(int i = 15, int j = 30, int k = 20); 系统(“暂停”); 返回0; } void fun(int i, int j, int k) { cout << "i:" << i << " j:" << j << " k:" << k << endl; } 无乐趣(双i,双j) { cout << "i:" << i << "j:" << j << endl; } **************************************************** ********************** 单元加固 使用函数的重载完成返回顶部的方法。 现在有一个数组,定义一个方法getMax(),利用函数的重载来实现: 1。随意从数组中取出两个元素,传递给方法getMax()。可以返回较大的元素。 2。将整个数组传递给方法 getMax() 以返回数组中最大的元素。 /**************************************************** **************/ /* 单位合并 使用函数重载来完成返回最大值的方法。 现在有一个数组,定义一个方法getMax(),利用函数的重载来实现: 1。随意从数组中取出两个元素,传递给方法getMax()。可以返回较大的元素。 2。将整个数组传递给方法 getMax() 以返回数组中最大的元素。 */ /**************************************************** **************/ #包括 #包括 使用命名空间 std; int getMax(int *arr, int arr_len); int getMax(int a, int b); int main(void) { int arr[3] = { 5, 7, 3}; cout << getMax(arr, 3) << endl; //int getMax(int *arr, int arr_len); cout << getMax(8, 7) << endl;//int getMax(int a, int b); //system("暂停"); } int getMax(int *arr, int arr_len) { int max_temp = arr[0]; for (int i = 1; i < arr_len; i++) { if ( max_temp < arr[i]) { max_temp = arr[i]; } } 返回 max_temp; } int getMax(int a, int b) { 返回 a > b ?甲:乙; //如果a>b为true,则执行a,如果为false,则执行b } ********************************************* 将会 将_itoa改为_itoa_s即可解决问题相关推荐
谷歌nexus4,请输入搜索内
炒股新手需要了解哪些买卖技巧?
币安合约推出QTUM永续合约
高性能MySQL
PHP中常见的错误类型及其解决
如何使用PHP获取当月第几周(
7 个实用的 PHP 内置函数
设计公司网站优化方案怎么写
医院的网站怎么优化
如何修改文件格式后缀名,手机如
vs2013只能安装c【vs只
vs2022TODO高亮【vs
32768晶振产生1hz脉冲(
视频
阿里云centos7.2自行安
Centos7上使用yum安装
【原创】AM3352+TPS6
大数据驱动 全线进军线下
(附源码)springboo
朱松纯:AI需要由“心”驱动,
vs2010无法识别ture_
使用VPS实现动态IP拨号设置
如何将主机加入域:最简单的步骤
React Rebass 主题