﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-青蛙學堂-随笔分类-c#</title><link>http://www.cnitblog.com/yide/category/8903.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 27 Aug 2022 03:04:35 GMT</lastBuildDate><pubDate>Sat, 27 Aug 2022 03:04:35 GMT</pubDate><ttl>60</ttl><item><title>Elasticsearch简介</title><link>http://www.cnitblog.com/yide/archive/2022/08/26/96043.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 26 Aug 2022 06:18:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/08/26/96043.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/96043.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/08/26/96043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/96043.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/96043.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Elasticsearch简介<br /><br />Elasticsearch&nbsp;（ES）是一个基于Apache&nbsp;Lucene&#8482;的开源搜索引擎，无论在开源还是专有领域，Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。<br /><br />但是，Lucene只是一个库。想要发挥其强大的作用，你需使用C#将其集成到你的应用中。Lucene非常复杂，你需要深入的了解检索相关知识来理解它是如何工作的。<br /><br />Elasticsearch是使用Java编写并使用Lucene来建立索引并实现搜索功能，但是它的目的是通过简单连贯的RESTful&nbsp;API让全文搜索变得简单并隐藏Lucene的复杂性。<br /><br />不过，Elasticsearch不仅仅是Lucene和全文搜索引擎，它还提供：<br /><br />分布式的实时文件存储，每个字段都被索引并可被搜索<br /><br />实时分析的分布式搜索引擎<br /><br />可以扩展到上百台服务器，处理PB级结构化或非结构化数据<br /><br />而且，所有的这些功能被集成到一台服务器，你的应用可以通过简单的RESTful&nbsp;API、各种语言的客户端甚至命令行与之交互。<br /><br />上手Elasticsearch非常简单，它提供了许多合理的缺省值，并对初学者隐藏了复杂的搜索引擎理论。它开箱即用（安装即可使用），只需很少的学习既可在生产环境中使用。Elasticsearch在Apache&nbsp;2&nbsp;license下许可使用，可以免费下载、使用和修改。<br /><br />随着知识的积累，你可以根据不同的问题领域定制Elasticsearch的高级特性，这一切都是可配置的，并且配置非常灵活。<br /><br /><span style="color: #008000; "><br /></span><br />使用C#操作ES<br /><br />NEST是一个高层的客户端，可以映射所有请求和响应对象，拥有一个强类型查询DSL（领域特定语言），并且可以使用.net的特性比如协变、Auto&nbsp;Mapping&nbsp;Of&nbsp;POCOs，NEST内部使用的依然是Elasticsearch.Net客户端。<br /><br />Elasticsearch.net（NEST）客户端提供了强类型查询DSL，方便用户使用，源码下载。（https:<span style="color: #008000; ">//</span><span style="color: #008000; ">github.com/elastic/elasticsearch-net/releases/tag/2.4.4）</span><span style="color: #008000; "><br /></span><br />一、如何安装NEST<br /><br />打开VS的工具菜单，通过NuGet包管理器控制台，输入以下命令安装NEST<br /><br />Install-Package&nbsp;NEST<br /><br />安装后引用了以下三个DLL<br /><br />Elasticsearch.Net.dll（2.4.4）<br /><br />Nest.dll（2.4.4）<br /><br />Newtonsoft.Json.dll（9.0版本）<br /><br />二、链接elasticsearch<br /><br />你可以通过单个节点或者指定多个节点使用连接池链接到Elasticsearch集群，使用连接池要比单个节点链接到Elasticsearch更有优势，比如支持负载均衡、故障转移等。<br /><br />通过单点链接：<br /><br />var&nbsp;node&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri(&#8220;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">myserver:9200&#8221;);</span><span style="color: #008000; "><br /></span><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings(node);<br /><br />var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ElasticClient(settings);<br /><br />通过连接池链接：<br /><br />var&nbsp;nodes&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri[]<br /><br />{<br /><span style="color: #0000FF; ">new</span>&nbsp;Uri("http://myserver1:9200"),<br /><br /><span style="color: #0000FF; ">new</span>&nbsp;Uri("http://myserver2:9200"),<br /><br /><span style="color: #0000FF; ">new</span>&nbsp;Uri("http://myserver3:9200")<br />};<br /><br />var&nbsp;pool&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StaticConnectionPool(nodes);<br /><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings(pool);<br /><br />var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ElasticClient(settings);<br /><br />NEST&nbsp;Index<br /><br />为了知道请求需要操作哪个索引，Elasticsearch&nbsp;API期望收到一个或多个索引名称作为请求的一部分。<br /><br />一、指定索引<br /><br />1、可以通过ConnectionSettings使用.DefaultIndex()，来指定默认索引。当一个请求里没有指定具体索引时，NEST将请求默认索引。<br /><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings()<br /><br />.DefaultIndex("defaultindex");<br />2、可以通过ConnectionSettings使用.MapDefaultTypeIndices()，来指定被映射为CLR类型的索引。<br /><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings()<br /><br />.MapDefaultTypeIndices(m&nbsp;=&gt;&nbsp;m<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.Add(<span style="color: #0000FF; ">typeof</span>(Project),&nbsp;"projects")<br /><br />);<br />注意：通过.MapDefaultTypeIndices()指定索引的优先级要高于通过.DefaultIndex()指定索引，并且更适合简单对象（POCO）<br /><br />3、另外还可以显示的为请求指定索引名称，例如：<br /><br />var&nbsp;response&nbsp;=&nbsp;client.Index(student,&nbsp;s=&gt;s.Index(&#8220;db_test&#8221;));<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Search(s&nbsp;=&gt;&nbsp;s.Index(&#8220;db_test&#8221;));<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Delete(<span style="color: #0000FF; ">null</span>,&nbsp;s&nbsp;=&gt;&nbsp;s.Index(&#8220;db_test&#8221;));<br /><br />&#8230;&#8230;<br /><br />注意：当现实的为请求指定索引名称时，这个优先级是最高的，高于以上两种方式指定的索引。<br /><br />4、一些Elasticsearch&nbsp;API（比如query）可以采用一个、多个索引名称或者使用_all特殊标志发送请求，请求NEST上的多个或者所有节点<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">请求单一节点</span><span style="color: #008000; "><br /></span><br />var&nbsp;singleString&nbsp;=&nbsp;Nest.Indices.Index(&#8220;db_studnet&#8221;);<br /><br />var&nbsp;singleTyped&nbsp;=&nbsp;Nest.Indices.Index();<br /><br />ISearchRequest&nbsp;singleStringRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(singleString);<br /><br />ISearchRequest&nbsp;singleTypedRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(singleTyped);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">请求多个节点</span><span style="color: #008000; "><br /></span><br />var&nbsp;manyStrings&nbsp;=&nbsp;Nest.Indices.Index(&#8220;db_studnet&#8221;,&nbsp;&#8220;db_other_student&#8221;);<br /><br />var&nbsp;manyTypes&nbsp;=&nbsp;Nest.Indices.Index().And();<br /><br />ISearchRequest&nbsp;manyStringRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(manyStrings);<br /><br />ISearchRequest&nbsp;manyTypedRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(manyTypes);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">请求所有节点</span><span style="color: #008000; "><br /></span><br />var&nbsp;indicesAll&nbsp;=&nbsp;Nest.Indices.All;<br /><br />var&nbsp;allIndices&nbsp;=&nbsp;Nest.Indices.AllIndices;<br /><br />ISearchRequest&nbsp;indicesAllRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(indicesAll);<br /><br />ISearchRequest&nbsp;allIndicesRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(allIndices);<br /><br />二、创建索引<br /><br />Elasticsearch&nbsp;API允许你创建索引的同时对索引进行配置，例如：<br /><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CreateIndexDescriptor(&#8220;db_student&#8221;)<br /><br />.Settings(s&nbsp;=&gt;&nbsp;s.NumberOfShards(5).NumberOfReplicas(1));<br />client.CreateIndex(descriptor);<br /><br />这里指定了该索引的分片数为5、副本数为1。<br /><br />三、删除索引<br /><br />Elasticsearch&nbsp;API允许你删除索引，例如：<br /><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DeleteIndexDescriptor(&#8220;db_student&#8221;).Index(&#8220;db_student&#8221;);<br /><br />client.DeleteIndex(descriptor)<br /><br />这里制定了要删除的索引名称&#8220;db_student&#8221;，以下为更多删除用例：<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">删除指定索引所在节点下的所有索引</span><span style="color: #008000; "><br /></span><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DeleteIndexDescriptor(&#8220;db_student&#8221;).AllIndices();<br /><br />NEST&nbsp;Mapping<br /><br />NEST提供了多种映射方法，这里介绍下通过Attribute自定义映射。<br /><br />一、简单实现<br /><br />1、定义业务需要的POCO，并指定需要的Attribute<br /><br />[ElasticsearchType(Name&nbsp;=&nbsp;&#8220;student&#8221;)]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Student<br /><br />{<br />[Nest.String(Index&nbsp;=&nbsp;FieldIndexOption.NotAnalyzed)]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Id&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br /><br />[Nest.String(Analyzer&nbsp;=&nbsp;"standard")]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br /><br />[Nest.String(Analyzer&nbsp;=&nbsp;"standard")]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Description&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;DateTime&nbsp;DateTime&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />}<br /><br />2、接着我们通过.AutoMap()来实现映射<br /><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CreateIndexDescriptor(&#8220;db_student&#8221;)<br /><br />.Settings(s&nbsp;=&gt;&nbsp;s.NumberOfShards(5).NumberOfReplicas(1))<br /><br />.Mappings(ms&nbsp;=&gt;&nbsp;ms<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.Map&lt;Student&gt;(m&nbsp;=&gt;&nbsp;m.AutoMap())<br /><br />);<br />client.CreateIndex(descriptor);<br /><br />注意：通过.Properties()可以重写通过Attribute定义的映射<br /><br />二、Attribute介绍<br /><br />1、StringAttribute<br /><br />2、NumberAttribute<br /><br />3、BooleanAttribute<br /><br />属性名&nbsp;值类型&nbsp;描述<br />Boost&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;加权值，值越大得分越高<br />NullValue&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;插入文档时，如果数据为NULL时的默认值<br /><br />4、DateAttribute<br /><br />属性名&nbsp;值类型&nbsp;描述<br />Boost&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;加权值，值越大得分越高<br />NullValue&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;插入文档时，如果数据为NULL时的默认值<br />Format&nbsp;<span style="color: #0000FF; ">string</span><br /><br />5、ObjectAttribute<br /><br />属性名&nbsp;值类型&nbsp;描述<br />type&nbsp;<span style="color: #0000FF; ">string</span>/Type&nbsp;构造函数参数，指定当前属性的类型T<br />Dynamic&nbsp;DynamicMapping<br /><br />NEST&nbsp;Search<br /><br />NEST提供了支持Lambda链式query&nbsp;DLS（领域特定语言）方式，以下是简单实现及各个query的简述。<br /><br />一、简单实现<br /><br />1、定义SearchDescriptor，方便项目中复杂业务的实现<br /><br />var&nbsp;query&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Nest.SearchDescriptor&lt;Models.ESObject&gt;();<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Search(x&nbsp;=&gt;&nbsp;query)<br /><br />2、检索title和content中包含key，并且作者不等于&#8220;wenli&#8221;的文档<br /><br />query.Query(q&nbsp;=&gt;<br /><br />q.Bool(b&nbsp;=&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;b.Must(m&nbsp;=&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.MultiMatch(t&nbsp;=&gt;&nbsp;t.Fields(f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Title).Field(obj&nbsp;=&gt;&nbsp;obj.Content)).Query(key))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.MustNot(m&nbsp;=&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.QueryString(t&nbsp;=&gt;&nbsp;t.Fields(f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Author)).Query("wenli"))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;)<br /><br />)<br />);<br /><br />注意：<br /><br />如果Elasticsearch使用默认分词，Title和Content的attribute为[Nest.String(Analyzer&nbsp;=&nbsp;&#8220;standard&#8221;)]<br /><br />如果Elasticsearch使用的是IK分词，Title和Content的attribute为[Nest.String(Analyzer&nbsp;=&nbsp;&#8220;ikmaxword&#8221;)]或者[Nest.String(Analyzer&nbsp;=&nbsp;&#8220;ik_smart&#8221;)]<br /><br />Author的attribute为[Nest.String(Index&nbsp;=&nbsp;FieldIndexOption.NotAnalyzed)]，禁止使用分析器<br /><br />3、过滤作者等于&#8220;wenli&#8221;的文档<br /><br />query.PostFilter(x&nbsp;=&gt;&nbsp;x.Term(t&nbsp;=&gt;&nbsp;t.Field(obj&nbsp;=&gt;&nbsp;obj.Author).Value(&#8220;wenli&#8221;)));<br /><br />4、过滤作者等于&#8220;wenli&#8221;或者等于&#8220;yswenli&#8221;的文档，匹配多个作者中间用空格隔开<br /><br />query.PostFilter(x&nbsp;=&gt;&nbsp;x.QueryString(t&nbsp;=&gt;&nbsp;t.Fields(f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Author)).Query(&#8220;wenli&nbsp;yswenli&#8221;)));<br /><br />5、过滤数量在1~100之间的文档<br /><br />query.PostFilter(x&nbsp;=&gt;&nbsp;x.Range(t&nbsp;=&gt;&nbsp;t.Field(obj&nbsp;=&gt;&nbsp;obj.Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));<br /><br />6、排序，按照得分倒叙排列<br /><br />query.Sort(x&nbsp;=&gt;&nbsp;x.Field("_score",&nbsp;Nest.SortOrder.Descending));<br /><br />7、定义高亮样式及字段<br /><br />query.Highlight(h&nbsp;=&gt;&nbsp;h<br /><br />.PreTags("&lt;b&gt;")<br /><br />.PostTags("&lt;/b&gt;")<br /><br />.Fields(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Title),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Content),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&gt;&nbsp;f.Field("_all")<br /><br />)<br />);<br /><br />8、拼装查询内容，整理数据，方便前段调用<br /><br />var&nbsp;list&nbsp;=&nbsp;result.Hits.Select(c&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Models.ESObject()<br /><br />{<br />Id&nbsp;=&nbsp;c.Source.Id,<br /><br />Title&nbsp;=&nbsp;c.Highlights&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;c.Source.Title&nbsp;:&nbsp;c.Highlights.Keys.Contains("title")&nbsp;?&nbsp;<span style="color: #0000FF; ">string</span>.Join("",&nbsp;c.Highlights["title"].Highlights)&nbsp;:&nbsp;c.Source.Title,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">高亮显示的内容，一条记录中出现了几次</span><span style="color: #008000; "><br /></span><br />Content&nbsp;=&nbsp;c.Highlights&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;c.Source.Content&nbsp;:&nbsp;c.Highlights.Keys.Contains("content")&nbsp;?&nbsp;<span style="color: #0000FF; ">string</span>.Join("",&nbsp;c.Highlights["content"].Highlights)&nbsp;:&nbsp;c.Source.Content,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">高亮显示的内容，一条记录中出现了几次</span><span style="color: #008000; "><br /></span><br />Author&nbsp;=&nbsp;c.Source.Author,<br /><br />Number&nbsp;=&nbsp;c.Source.Number,<br /><br />IsDisplay&nbsp;=&nbsp;c.Source.IsDisplay,<br /><br />Tags&nbsp;=&nbsp;c.Source.Tags,<br /><br />Comments&nbsp;=&nbsp;c.Source.Comments,<br /><br />DateTime&nbsp;=&nbsp;c.Source.DateTime,<br />})<br /><br />二、query&nbsp;DSL介绍<br /><br />elasticsearch.net&nbsp;Document<br /><br />文档操作包含添加/更新文档、局部更新文档、删除文档及对应的批量操作文档方法。<br /><br />一、添加/更新文档及批量操作<br /><br />添加/更新单一文档<br /><br />Client.Index(student);<br /><br />批量添加/更新文档<br /><br />var&nbsp;list&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List();<br /><br />client.IndexMany(list);<br /><br />二、局部更新单一文档及批量操作<br /><br />局部更新单一文档<br /><br />client.Update&lt;Student,&nbsp;<span style="color: #0000FF; ">object</span>&gt;(&#8220;002&#8221;,&nbsp;upt&nbsp;=&gt;&nbsp;upt.Doc(<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;Name&nbsp;=&nbsp;&#8220;wenli&#8221;&nbsp;}));<br /><br />局部更新批量文档<br /><br />var&nbsp;ids&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;{&nbsp;&#8220;002&#8221;&nbsp;};<br /><br />var&nbsp;bulkQuest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BulkRequest()&nbsp;{&nbsp;Operations&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;};<br /><br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;v&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;ids)<br /><br />{<br />var&nbsp;operation&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BulkUpdateOperation&lt;Student,&nbsp;<span style="color: #0000FF; ">object</span>&gt;(v);<br /><br />operation.Doc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;Name&nbsp;=&nbsp;"wenli"&nbsp;};<br /><br />bulkQuest.Operations.Add(operation);<br />}<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Bulk(bulkQuest);<br /><br />三、删除文档及批量操作<br /><br />删除单一文档<br /><br />client.Delete(&#8220;001&#8221;);<br /><br />批量删除文档<br /><br />var&nbsp;ids&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;{&nbsp;&#8220;001&#8221;,&nbsp;&#8220;002&#8221;&nbsp;};<br /><br />var&nbsp;bulkQuest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BulkRequest()&nbsp;{&nbsp;Operations&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;};<br /><br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;v&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;ids)<br /><br />{<br />bulkQuest.Operations.Add(<span style="color: #0000FF; ">new</span>&nbsp;BulkDeleteOperation&lt;Student&gt;(v));<br />}<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Bulk(bulkQuest);<br /><br /></div><img src ="http://www.cnitblog.com/yide/aggbug/96043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-08-26 14:18 <a href="http://www.cnitblog.com/yide/archive/2022/08/26/96043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ES C# 增删改</title><link>http://www.cnitblog.com/yide/archive/2022/08/10/96040.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Wed, 10 Aug 2022 03:20:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/08/10/96040.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/96040.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/08/10/96040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/96040.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/96040.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><br />索引(添加)<br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings(<span style="color: #0000FF; ">new</span>&nbsp;Uri("http://****:9200/")).DefaultFieldNameInferrer(name&nbsp;=&gt;&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ElasticClient(settings);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">index、indexDocument：添加</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexResponse1&nbsp;=&nbsp;client.IndexDocument&lt;People&gt;(<span style="color: #0000FF; ">new</span>&nbsp;People&nbsp;{&nbsp;Id&nbsp;=&nbsp;4,&nbsp;Age&nbsp;=&nbsp;4,&nbsp;Name&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Name&nbsp;{&nbsp;Firstname&nbsp;=&nbsp;"wj",&nbsp;Lastname&nbsp;=&nbsp;"f"&nbsp;}&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexResponse2&nbsp;=&nbsp;client.Index&lt;People&gt;(<span style="color: #0000FF; ">new</span>&nbsp;People&nbsp;{&nbsp;Id&nbsp;=&nbsp;4,&nbsp;Age&nbsp;=&nbsp;4&nbsp;},&nbsp;i&nbsp;=&gt;&nbsp;i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Index("my_index")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Id(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Routing("1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Refresh(Refresh.True));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexResponse3&nbsp;=&nbsp;client.IndexDocument&lt;People&gt;(<span style="color: #0000FF; ">new</span>&nbsp;People&nbsp;{&nbsp;Id&nbsp;=&nbsp;4,&nbsp;Age&nbsp;=&nbsp;4,&nbsp;Name&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Name&nbsp;{&nbsp;Firstname&nbsp;=&nbsp;"wj",&nbsp;Lastname&nbsp;=&nbsp;"f"&nbsp;}&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />删除<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">delete、deleteByQuery：删除</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">删除指定id文档</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.Delete&lt;ElasticUserModel&gt;(3,&nbsp;d&nbsp;=&gt;&nbsp;d.Index("index13"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">删除指定条件的文档</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.DeleteByQuery&lt;ElasticUserModel&gt;(d&nbsp;=&gt;&nbsp;d.Index("index13").Query(q&nbsp;=&gt;&nbsp;q.Term("UserID",&nbsp;4)));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />修改<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">update：修改</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Update&lt;object&gt;只会修改指定的字段，如下只修改Name，其他字段不变。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;updateResponse&nbsp;=&nbsp;client.Update&lt;<span style="color: #0000FF; ">object</span>&gt;(2,&nbsp;u&nbsp;=&gt;&nbsp;u<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Index("index13")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Doc(<span style="color: #0000FF; ">new</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;=&nbsp;"fan22"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />批量增删改<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">bulk：批量增删改</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bulkResponse&nbsp;=&nbsp;client.Bulk(b=&gt;b<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Update&lt;<span style="color: #0000FF; ">object</span>&gt;(u=&gt;u.Index("index13").Id(2).Doc(<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;Name="fan222"&nbsp;}))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Delete&lt;ElasticUserModel&gt;(d=&gt;d.Index("index13").Id(1))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Index&lt;ElasticUserModel&gt;(i=&gt;i.Index("index13").Document(<span style="color: #0000FF; ">new</span>&nbsp;ElasticUserModel&nbsp;{UserID=11,Name="fan11",Age=11,CreateTime=DateTime.Now,Handle="handle11"&nbsp;}))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />version（乐观锁）<br />查询时获取文档版本号，修改时传版本号，如果相同就修改<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">查询到版本号</span><span style="color: #008000; "><br /></span>&nbsp;var&nbsp;result&nbsp;=&nbsp;_client.Search&lt;TestModel5&gt;(<br />&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.Index(indexName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Query(q&nbsp;=&gt;&nbsp;q.Term(tm&nbsp;=&gt;&nbsp;tm.Field(fd=&gt;fd.State).Value(1))).Size(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Version()<span style="color: #008000; ">//</span><span style="color: #008000; ">结果中包含版本号</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;s&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;result.Hits)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(s.Id&nbsp;+&nbsp;"&nbsp;&nbsp;-&nbsp;&nbsp;"&nbsp;+&nbsp;s.Version);<br />}<br /><br />var&nbsp;path&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DocumentPath&lt;TestModel5&gt;(1);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">更新时带上版本号&nbsp;如果服务端版本号与传入的版本好相同才能更新成功</span><span style="color: #008000; "><br /></span>var&nbsp;response&nbsp;=&nbsp;_client.Update(path,&nbsp;(p)&nbsp;=&gt;&nbsp;p<br />&nbsp;&nbsp;&nbsp;&nbsp;.Index(indexName)<br />&nbsp;&nbsp;&nbsp;&nbsp;.Type(<span style="color: #0000FF; ">typeof</span>(TestModel5))<br />&nbsp;&nbsp;&nbsp;&nbsp;.Version(2)<span style="color: #008000; ">//</span><span style="color: #008000; ">限制es中版本号为2时才能成功</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;.Doc(<span style="color: #0000FF; ">new</span>&nbsp;TestModel5()&nbsp;{&nbsp;Name&nbsp;=&nbsp;"测测测"&nbsp;+&nbsp;DateTime.Now&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br /><br /><br /><br /><br /></div><img src ="http://www.cnitblog.com/yide/aggbug/96040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-08-10 11:20 <a href="http://www.cnitblog.com/yide/archive/2022/08/10/96040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ES SEARCH 数据限制</title><link>http://www.cnitblog.com/yide/archive/2022/07/14/95728.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Thu, 14 Jul 2022 03:09:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/07/14/95728.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/95728.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/07/14/95728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/95728.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/95728.html</trackback:ping><description><![CDATA[<div>一般我们使用es的可视化工具来操作es</div><div></div><div>我们进入kibana的页面通过</div><div></div><div>http://ip:5601/app/kibana</div><div>在设置中找到索引管理</div><div></div><div>找到我们需要修改的索引,选择Edit settings,</div><div></div><div>添加"index.max_result_window": "1000000",</div><div></div><div>最后save就可以了</div><img src ="http://www.cnitblog.com/yide/aggbug/95728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-07-14 11:09 <a href="http://www.cnitblog.com/yide/archive/2022/07/14/95728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net core 连sqlserver</title><link>http://www.cnitblog.com/yide/archive/2022/07/11/95669.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 11 Jul 2022 11:56:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/07/11/95669.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/95669.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/07/11/95669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/95669.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/95669.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />.net&nbsp;core使用EF&nbsp;core连接mssqlserver数据库<br />一，打开控制台<br />二，输入以下代码<br />1.Install-Package&nbsp;Microsoft.EntityFrameworkCore<br /><br />2.Install-Package&nbsp;Microsoft.EntityFrameworkCore.SqlServer<br /><br />3.Install-Package&nbsp;Microsoft.EntityFrameworkCore.Tools<br /><br />4.Scaffold-DbContext&nbsp;&#8220;Server=.;Database=EFCore;Trusted_Connection=True;User&nbsp;ID=用户名;Password=密码;&#8221;&nbsp;Microsoft.EntityFrameworkCore.SqlServer&nbsp;-OutputDir&nbsp;要存放实体的文件夹名称<br /><br />&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;System.Linq;</div><img src ="http://www.cnitblog.com/yide/aggbug/95669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-07-11 19:56 <a href="http://www.cnitblog.com/yide/archive/2022/07/11/95669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ES ip访问</title><link>http://www.cnitblog.com/yide/archive/2022/07/01/95668.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 01 Jul 2022 06:33:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/07/01/95668.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/95668.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/07/01/95668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/95668.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/95668.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; margin-bottom: 16px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; padding-top: 0px; padding-bottom: 0px; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto;">在虚拟机安装Elasticsearch后，浏览器可以正常访问9200端口，但是在宿主机上无法通过虚拟机地址加9200端口进入，找了很多资料，说的是修改配置文件elasticsearch.yml，加上network.host: 0.0.0.0，加上这条配置后es无法启动，最后查到需要加上如下四条配置，只加一条无法启动。</p><pre style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;; font-size: 13px; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: #333333; word-break: break-all; overflow-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px;"><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;">network.host: 0.0.0.0 http.port: 9200 transport.host: localhost transport.tcp.port: 9300</code></pre><img src ="http://www.cnitblog.com/yide/aggbug/95668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-07-01 14:33 <a href="http://www.cnitblog.com/yide/archive/2022/07/01/95668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# Encoding.Unicode.GetBytes 转码取字符串</title><link>http://www.cnitblog.com/yide/archive/2022/06/07/95655.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Tue, 07 Jun 2022 08:34:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/06/07/95655.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/95655.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/06/07/95655.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/95655.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/95655.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;GetUnicodeString(<span style="color: #0000FF; ">byte</span>[]&nbsp;buffer)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(buffer&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;(size&nbsp;=&nbsp;buffer.Length)&nbsp;&gt;=&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;-=&nbsp;size&nbsp;%&nbsp;2;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;sizeof(wchar_t)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;value&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[size&nbsp;/&nbsp;2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i&nbsp;+=&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value[i&nbsp;/&nbsp;2]&nbsp;=&nbsp;(<span style="color: #0000FF; ">char</span>)((buffer[i&nbsp;+&nbsp;1]&nbsp;&lt;&lt;&nbsp;8)&nbsp;+&nbsp;buffer[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">string</span>(value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">string</span>.Empty;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Index()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;<span style="color: #0000FF; ">byte</span>&gt;&nbsp;list&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;<span style="color: #0000FF; ">byte</span>&gt;&nbsp;{&nbsp;0,&nbsp;8,&nbsp;0,&nbsp;0,&nbsp;6,&nbsp;1,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;8&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;bytes&nbsp;=&nbsp;Encoding.Unicode.GetBytes("MSDTC");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.AddRange(BitConverter.GetBytes(bytes.Length));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.AddRange(bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;rs&nbsp;=&nbsp;list.ToArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">"000800000601000000080A0000004D005300440054004300"</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;<span style="color: #0000FF; ">byte</span>&gt;&nbsp;nlist&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;<span style="color: #0000FF; ">byte</span>&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist.AddRange(rs);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;13;&nbsp;i&gt;=0;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlist.RemoveAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;nlist.ToArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;num&nbsp;=&nbsp;rs.Count();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;hex&nbsp;=&nbsp;Convert.ToHexString(bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;hex1&nbsp;=&nbsp;Convert.ToHexString(rs);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;abc&nbsp;=&nbsp;Encoding.UTF8.GetString(bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;abc2&nbsp;=&nbsp;Encoding.UTF8.GetString(rs);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;ddd&nbsp;=&nbsp;abc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">"4D005300440054004300"</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hex&nbsp;=&nbsp;GetUnicodeString(bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;&nbsp;&nbsp;hex2=&nbsp;GetUnicodeString(rs);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;aa&nbsp;=&nbsp;hex;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;bb&nbsp;=&nbsp;aa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;View();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><img src ="http://www.cnitblog.com/yide/aggbug/95655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-06-07 16:34 <a href="http://www.cnitblog.com/yide/archive/2022/06/07/95655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js访问.net 接口frombody form</title><link>http://www.cnitblog.com/yide/archive/2022/05/09/92713.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 09 May 2022 07:29:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/05/09/92713.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92713.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/05/09/92713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92713.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92713.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->一、使用jQuery&nbsp;Ajax访问<br />（一）、表单传参(&nbsp;[FromForm])<br />数据类型：Object<br /><br />ContenyType类型：application/x-www-form-urlencoded<br /><br />1<br /><span style="color: #0000FF; ">var</span>&nbsp;model&nbsp;=&nbsp;{&nbsp;name:&nbsp;"刘大大",&nbsp;age:&nbsp;23,&nbsp;sex:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;};<br />前台请求<br /><br /><br /><span style="color: #0000FF; ">var</span>&nbsp;model&nbsp;=&nbsp;{&nbsp;name:&nbsp;"刘大大",&nbsp;age:&nbsp;23,&nbsp;sex:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"http://localhost:9001/API/Default/FormCall",<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;async:&nbsp;<span style="color: #0000FF; ">true</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;"json",<br />&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;model,<br />&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/x-www-form-urlencoded",<br />&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log("data:");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />});<br />(二）、JSON字符串[FromBdy]<br />数据类型：Json<br /><br />ContenyType类型：application/json<br /><br />1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;json&nbsp;=&nbsp;'{"name":"刘大大","age":23,"sex":<span style="color: #0000FF; ">true</span>}';<br />也可以使用JSON.stringify(Object)将Object转换为JSON字符串<br /><br />前端请求<br /><br /><span style="color: #0000FF; ">var</span>&nbsp;model&nbsp;=&nbsp;{&nbsp;name:&nbsp;"刘大大",&nbsp;age:&nbsp;23,&nbsp;sex:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"http://localhost:9001/API/Default/BodyCall",<br />&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;async:&nbsp;<span style="color: #0000FF; ">true</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;"json",<br />&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;JSON.stringify(model),<br />&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json",<br />&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log("data:");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />});<br />（三）、文件上传<br />建立FormData对象<br /><br />数据类型：FromData<br /><br />ContenyType类型false,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">必须false才会避开jQuery对&nbsp;formdata&nbsp;的默认处理&nbsp;processData类型:&nbsp;false,&nbsp;//必须false才会自动加上正确的Content-Type</span><span style="color: #008000; "><br /></span><br />html<br /><br />1<br />&lt;input&nbsp;type="file"&nbsp;multiple&nbsp;id="file"&nbsp;/&gt;<br />JS获取文件对象<br /><br /><br /><span style="color: #0000FF; ">var</span>&nbsp;file&nbsp;=&nbsp;document.getElementById("file");<br />&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;files&nbsp;=&nbsp;file.files;<br />&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;formData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FormData();<br />&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;files.length;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formData.append(files[i].name,&nbsp;files[i]);<br />&nbsp;}　　　　<br />formData.append("name",&nbsp;"刘大大");<span style="color: #008000; ">//</span><span style="color: #008000; ">可追加参数</span><span style="color: #008000; "><br /></span>AJAX请求<br /><br /><br />$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"http://localhost:9001/API/Default/Upload",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;async:&nbsp;<span style="color: #0000FF; ">true</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;"json",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;formData,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;<span style="color: #0000FF; ">false</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processData:&nbsp;<span style="color: #0000FF; ">false</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />完整HTML源码<br /><br /><br />&lt;div&nbsp;class="text-center"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&nbsp;class="display-4"&gt;Welcome&lt;/h1&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;Learn&nbsp;about&nbsp;&lt;a&nbsp;href="https://docs.microsoft.com/aspnet/core"&gt;building&nbsp;Web&nbsp;apps&nbsp;<span style="color: #0000FF; ">with</span>&nbsp;ASP.NET&nbsp;Core&lt;/a&gt;.&lt;/p&gt;<br />&lt;/div&gt;<br />&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="button"&nbsp;id="fromform"&nbsp;value="Form传参"&nbsp;/&gt;&lt;hr&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="button"&nbsp;id="frombody"&nbsp;value="Body传参"&nbsp;/&gt;&lt;hr&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="file"&nbsp;multiple&nbsp;id="file"&nbsp;name="上传文件"&nbsp;/&gt;&lt;hr&nbsp;/&gt;<br />&lt;/div&gt;<br />&lt;script&nbsp;src="https://cdn.bootcss.com/jquery/3.3.0/jquery.js"&gt;&lt;/script&gt;<br />&lt;script&gt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;FromForm<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;fromform&nbsp;=&nbsp;document.getElementById("fromform");<br />&nbsp;&nbsp;&nbsp;&nbsp;$(fromform).click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;'http:<span style="color: #008000; ">//</span><span style="color: #008000; ">localhost:9001/API/Default/FormCall';</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;model&nbsp;=&nbsp;{&nbsp;name:&nbsp;"刘大大",&nbsp;age:&nbsp;23,&nbsp;sex:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;async:&nbsp;<span style="color: #0000FF; ">true</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;model,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/x-www-form-urlencoded",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(JSON.stringify(data));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(result)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;FromBody<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;$('#frombody').click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;'http:<span style="color: #008000; ">//</span><span style="color: #008000; ">localhost:9001/API/Default/BodyCall';</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;json&nbsp;=&nbsp;'{"name":"刘大大","age":23,"sex":<span style="color: #0000FF; ">true</span>}';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;async:&nbsp;<span style="color: #0000FF; ">true</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;json,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(JSON.stringify(data));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(result)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;FormData<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;file&nbsp;=&nbsp;document.getElementById("file");<br />&nbsp;&nbsp;&nbsp;&nbsp;file.onchange&nbsp;=&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;file&nbsp;=&nbsp;document.getElementById("file");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;files&nbsp;=&nbsp;file.files;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;formData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FormData();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;files.length;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formData.append(files[i].name,&nbsp;files[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formData.append("name",&nbsp;"刘大大");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;isUploadByJs&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;isUploadByJs&nbsp;?&nbsp;'http:<span style="color: #008000; ">//</span><span style="color: #008000; ">localhost:9001/API/Default/Upload'&nbsp;:&nbsp;'http://localhost:9002/Home/Upload';</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;async:&nbsp;<span style="color: #0000FF; ">true</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;"json",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;formData,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">必须false才会避开jQuery对&nbsp;formdata&nbsp;的默认处理</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processData:&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">必须false才会自动加上正确的Content-Type</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers:&nbsp;{&nbsp;ReadTime:&nbsp;Date.now()&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beforeSend:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(xhr)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.setRequestHeader('Author',&nbsp;'liudada');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(JSON.stringify(data));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(result)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&lt;/script&gt;　　<br />二、使用C#后台访问<br />（一）、Get访问<br /><br /><span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;"http://localhost:57954/API/Default/Test";<br />using&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpClient(<span style="color: #0000FF; ">new</span>&nbsp;HttpClientHandler()&nbsp;{&nbsp;AutomaticDecompression&nbsp;=&nbsp;DecompressionMethods.Deflate&nbsp;|&nbsp;DecompressionMethods.GZip&nbsp;}))<br />{<br /><span style="color: #0000FF; ">var</span>&nbsp;taskResponse&nbsp;=&nbsp;client.GetAsync(url);<br />taskResponse.Wait();<br /><span style="color: #0000FF; ">if</span>&nbsp;(taskResponse.IsCompletedSuccessfully)<br />{<br /><span style="color: #0000FF; ">var</span>&nbsp;taskStream&nbsp;=&nbsp;taskResponse.Result.Content.ReadAsStreamAsync();<br />taskStream.Wait();<br />using&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(taskStream.Result))<br />{<br />jsonString&nbsp;=&nbsp;reader.ReadToEnd();<br />}<br />}<br />}<br />（二）、Post访问<br /><br /><span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;"http://localhost:57954/API/Default/BodyCall";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">var</span>&nbsp;data&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;{name="刘大大",age=23,sex=<span style="color: #0000FF; ">true</span>&nbsp;};<br />using&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpClient(<span style="color: #0000FF; ">new</span>&nbsp;HttpClientHandler()&nbsp;{&nbsp;AutomaticDecompression&nbsp;=&nbsp;DecompressionMethods.Deflate&nbsp;|&nbsp;DecompressionMethods.GZip&nbsp;}))<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;jsonToSend&nbsp;=&nbsp;JsonConvert.SerializeObject(data,&nbsp;Formatting.None,&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IsoDateTimeConverter());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;body&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringContent(jsonToSend,&nbsp;Encoding.UTF8,&nbsp;"application/json");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;taskResponse&nbsp;=&nbsp;client.PostAsync(url,&nbsp;body);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskResponse.Wait();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(taskResponse.IsCompletedSuccessfully)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;taskStream&nbsp;=&nbsp;taskResponse.Result.Content.ReadAsStreamAsync();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskStream.Wait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(taskStream.Result))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonString&nbsp;=&nbsp;reader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />　　<br /><br />（三）、上传文件<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;上传文件</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;[RequestSizeLimit(1_073_741_824)]<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IActionResult&nbsp;Upload()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;"http://localhost:9001/Api/Default/Upload";<br />&#8203;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;data&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MultipartFormDataContent();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(Request.HasFormContentType)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;request&nbsp;=&nbsp;Request.Form.Files;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;item&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;request)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Add(<span style="color: #0000FF; ">new</span>&nbsp;StreamContent(item.OpenReadStream()),&nbsp;item.Name,&nbsp;item.FileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&#8203;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;item&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;Request.Form)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.Add(<span style="color: #0000FF; ">new</span>&nbsp;StringContent(item.Value),&nbsp;item.Key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;jsonString&nbsp;=&nbsp;string.Empty;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpClient(<span style="color: #0000FF; ">new</span>&nbsp;HttpClientHandler()&nbsp;{&nbsp;AutomaticDecompression&nbsp;=&nbsp;DecompressionMethods.Deflate&nbsp;|&nbsp;DecompressionMethods.GZip&nbsp;}))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;taskResponse&nbsp;=&nbsp;client.PostAsync(url,&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskResponse.Wait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(taskResponse.IsCompletedSuccessfully)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;taskStream&nbsp;=&nbsp;taskResponse.Result.Content.ReadAsStreamAsync();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskStream.Wait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(taskStream.Result))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonString&nbsp;=&nbsp;reader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JsonResult(jsonString);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />　　<br /><br />WebHelper</div><img src ="http://www.cnitblog.com/yide/aggbug/92713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-05-09 15:29 <a href="http://www.cnitblog.com/yide/archive/2022/05/09/92713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#后台调用web接口方法</title><link>http://www.cnitblog.com/yide/archive/2022/05/02/92599.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 02 May 2022 06:44:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/05/02/92599.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92599.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/05/02/92599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92599.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92599.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->.net&nbsp;core模拟发送post和get请求<br />1年前&nbsp;46,320&nbsp;0<br /><br /><span style="color: #0000FF; ">string</span>&nbsp;url&nbsp;=&nbsp;"http://www.xxx.com/api/postmsg";<br /><br /><span style="color: #0000FF; ">string</span>&nbsp;jsonContent&nbsp;=&nbsp;JsonConvert.SerializeObject(message);<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;(var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpClient())<br />{<br />var&nbsp;content&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringContent(jsonContent,&nbsp;Encoding.UTF8,&nbsp;"application/json");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">上面代码使http&nbsp;Content-Type&nbsp;为&nbsp;application/json;&nbsp;charset=utf-8。如果希望Content-Type为application/json，可以使用下面两行代码<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">content.Headers.Remove("Content-Type");&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;"{application/json;&nbsp;charset=utf-8}"<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">content.Headers.Add("Content-Type",&nbsp;"application/json");</span><span style="color: #008000; "><br /></span><br />client.DefaultRequestHeaders.Authorization&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;AuthenticationHeaderValue("Bearer");<br /><span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;client.PostAsync(url,&nbsp;content).Result.Content.ReadAsStringAsync().Result;<br />}<br /><br /><br /><br />以上为核心代码。<br /><br />https:<span style="color: #008000; ">//</span><span style="color: #008000; ">docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2</span><span style="color: #008000; "><br /></span><br />&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;公共方法&#8212;&#8212;&nbsp;发送http&nbsp;post请求&nbsp;&nbsp;2020年6月2日11:20:42&nbsp;&nbsp;Dennyhui<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="formData"&gt;</span><span style="color: #008000; ">参数</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="requestUri"&gt;</span><span style="color: #008000; ">请求地址</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="token"&gt;</span><span style="color: #008000; ">身份验证秘钥，可为空</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;async&nbsp;Task&lt;<span style="color: #0000FF; ">string</span>&gt;&nbsp;Client_Post(MultipartFormDataContent&nbsp;formData,&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;requestUri,&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;token)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">从工厂获取请求对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;client&nbsp;=&nbsp;_httpClientFactory.CreateClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">添加请求头</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!<span style="color: #0000FF; ">string</span>.IsNullOrWhiteSpace(token))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.DefaultRequestHeaders.Add("Authorization",&nbsp;token);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpResponseMessage&nbsp;response&nbsp;=&nbsp;client.PostAsync(requestUri,&nbsp;formData).Result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;response.Content.ReadAsStringAsync().Result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;公共方法&#8212;&#8212;&nbsp;发送http&nbsp;get&nbsp;请求&nbsp;&nbsp;2020年6月2日11:22:11&nbsp;&nbsp;Dennyhui<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;para&gt;</span><span style="color: #008000; ">最终以url参数的方式提交</span><span style="color: #808080; ">&lt;/para&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="parameters"&gt;</span><span style="color: #008000; ">参数字典,可为空</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="requestUri"&gt;</span><span style="color: #008000; ">例如/api/Files/UploadFile</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;async&nbsp;Task&lt;<span style="color: #0000FF; ">string</span>&gt;&nbsp;Client_Get(Dictionary&lt;<span style="color: #0000FF; ">string</span>,&nbsp;<span style="color: #0000FF; ">string</span>&gt;&nbsp;parameters,&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;requestUri,&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;token)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">从工厂获取请求对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;client&nbsp;=&nbsp;_httpClientFactory.CreateClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">添加请求头</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!<span style="color: #0000FF; ">string</span>.IsNullOrWhiteSpace(token))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.DefaultRequestHeaders.Add("Authorization",&nbsp;"Bearer&nbsp;"&nbsp;+&nbsp;token);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">拼接地址</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parameters&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;strParam&nbsp;=&nbsp;<span style="color: #0000FF; ">string</span>.Join("&amp;",&nbsp;parameters.Select(o&nbsp;=&gt;&nbsp;o.Key&nbsp;+&nbsp;"="&nbsp;+&nbsp;o.Value));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestUri&nbsp;=&nbsp;<span style="color: #0000FF; ">string</span>.Concat(requestUri,&nbsp;'?',&nbsp;strParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.BaseAddress&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri(requestUri);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">client.DefaultRequestHeaders.Add("Content-Type",&nbsp;"application/json;&nbsp;charset=utf-8");</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;client.GetStringAsync(requestUri).Result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;****************************************************<br />&nbsp;此处内容传输都是用UTF-8编码<br /><br />1、不带参数发送Post请求<br /><br /><br /><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;指定Post地址使用Get&nbsp;方式获取全部字符串<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="url"&gt;</span><span style="color: #008000; ">请求后台地址</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Post(<span style="color: #0000FF; ">string</span>&nbsp;url)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;req&nbsp;=&nbsp;(HttpWebRequest)WebRequest.Create(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Method&nbsp;=&nbsp;"POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebResponse&nbsp;resp&nbsp;=&nbsp;(HttpWebResponse)req.GetResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;stream&nbsp;=&nbsp;resp.GetResponseStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">获取内容</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(StreamReader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(stream,&nbsp;Encoding.UTF8))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;reader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />2、带参数Post请求,指定键值对&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;指定Post地址使用Get&nbsp;方式获取全部字符串<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="url"&gt;</span><span style="color: #008000; ">请求后台地址</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Post(<span style="color: #0000FF; ">string</span>&nbsp;url,Dictionary&lt;<span style="color: #0000FF; ">string</span>,<span style="color: #0000FF; ">string</span>&gt;&nbsp;dic)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;req&nbsp;=&nbsp;(HttpWebRequest)WebRequest.Create(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Method&nbsp;=&nbsp;"POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentType&nbsp;=&nbsp;"application/x-www-form-urlencoded";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#region</span>&nbsp;添加Post&nbsp;参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;item&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;dic)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.Append("&amp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.AppendFormat("{0}={1}",&nbsp;item.Key,&nbsp;item.Value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;data&nbsp;=&nbsp;Encoding.UTF8.GetBytes(builder.ToString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentLength&nbsp;=&nbsp;data.Length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(Stream&nbsp;reqStream&nbsp;=&nbsp;req.GetRequestStream())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Write(data,&nbsp;0,&nbsp;data.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#endregion</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebResponse&nbsp;resp&nbsp;=&nbsp;(HttpWebResponse)req.GetResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;stream&nbsp;=&nbsp;resp.GetResponseStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">获取响应内容</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(StreamReader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(stream,&nbsp;Encoding.UTF8))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;reader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />3、带参数的Post请求，指定发送字符串内容<br /><br /><br /><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;指定Post地址使用Get&nbsp;方式获取全部字符串<br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #008000; "><br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="url"&gt;</span><span style="color: #008000; ">请求后台地址</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;param&nbsp;name="content"&gt;</span><span style="color: #008000; ">Post提交数据内容(utf-8编码的)</span><span style="color: #808080; ">&lt;/param&gt;</span><span style="color: #008000; "><br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Post(<span style="color: #0000FF; ">string</span>&nbsp;url,&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;content)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;req&nbsp;=&nbsp;(HttpWebRequest)WebRequest.Create(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;req.Method&nbsp;=&nbsp;"POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;req.ContentType&nbsp;=&nbsp;"application/x-www-form-urlencoded";<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#region</span>&nbsp;添加Post&nbsp;参数<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;data&nbsp;=&nbsp;Encoding.UTF8.GetBytes(content);<br />&nbsp;&nbsp;&nbsp;&nbsp;req.ContentLength&nbsp;=&nbsp;data.Length;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(Stream&nbsp;reqStream&nbsp;=&nbsp;req.GetRequestStream())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Write(data,&nbsp;0,&nbsp;data.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#endregion</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HttpWebResponse&nbsp;resp&nbsp;=&nbsp;(HttpWebResponse)req.GetResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;stream&nbsp;=&nbsp;resp.GetResponseStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">获取响应内容</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(StreamReader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(stream,&nbsp;Encoding.UTF8))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;reader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />}<br /><br />&nbsp;转载方法：<br /><br /><br />HttpWebRequest&nbsp;req&nbsp;=&nbsp;(HttpWebRequest)HttpWebRequest.Create("http://fanyi.baidu.com/transcontent");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Encoding&nbsp;encoding&nbsp;=&nbsp;Encoding.UTF8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;param&nbsp;=&nbsp;"ie=utf-8&amp;source=txt&amp;query=hello&amp;t=1327829764203&amp;token=8a7dcbacb3ed72cad9f3fb079809a127&amp;from=auto&amp;to=auto";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">encoding.GetBytes(postData);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;bs&nbsp;=&nbsp;Encoding.ASCII.GetBytes(param);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;responseData&nbsp;=&nbsp;String.Empty;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Method&nbsp;=&nbsp;"POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentType&nbsp;=&nbsp;"application/x-www-form-urlencoded";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentLength&nbsp;=&nbsp;bs.Length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(Stream&nbsp;reqStream&nbsp;=&nbsp;req.GetRequestStream())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Write(bs,&nbsp;0,&nbsp;bs.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(HttpWebResponse&nbsp;response&nbsp;=&nbsp;(HttpWebResponse)req.GetResponse())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(StreamReader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(response.GetResponseStream(),encoding))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;responseData&nbsp;=&nbsp;reader.ReadToEnd().ToString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.Response.Write(responseData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;***************************************************************<br />&nbsp;<br />&nbsp;<br />&nbsp;调⽤webApi接⼝通过post⽅式传递实体参数时，发现接⼝那⾥接受不到数据，查找资料后顺利解决，顺便做下学习笔记。<br />⼀、json格式发送<br />⾸先将实体序列化为json格式的字符串，然后发送，⽰例代码&nbsp;如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;Students&nbsp;student&nbsp;=<span style="color: #0000FF; ">new</span>&nbsp;Students("1001","张三",20,"男");<br /><span style="color: #0000FF; ">string</span>&nbsp;json&nbsp;=&nbsp;JsonConvert.SerializeObject(student);<br /><span style="color: #0000FF; ">string</span>&nbsp;url&nbsp;="http://localhost:34626/api/values";<br /><span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;WebHelper.HttpWebRequest(url,&nbsp;json,&nbsp;Encoding.GetEncoding("utf-8"));<br />其中，HttpWebRequest⽅法⽰例代码如下：<br />publicstaticstringHttpWebRequest(<span style="color: #0000FF; ">string</span>&nbsp;url,<span style="color: #0000FF; ">string</span>&nbsp;parameters,&nbsp;Encoding&nbsp;encoding,<span style="color: #0000FF; ">int</span>&nbsp;timeout&nbsp;=120000)<br />{<br />var&nbsp;request&nbsp;=(HttpWebRequest)WebRequest.Create(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Timeout&nbsp;=&nbsp;timeout;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.CookieContainer&nbsp;=<span style="color: #0000FF; ">null</span>;<br /><span style="color: #0000FF; ">byte</span>[]&nbsp;postData&nbsp;=&nbsp;encoding.GetBytes(parameters);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Method&nbsp;="POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.ContentType&nbsp;="application/json";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.ContentLength&nbsp;=&nbsp;postData.Length;<br /><span style="color: #0000FF; ">using</span>(Stream&nbsp;stream&nbsp;=&nbsp;request.GetRequestStream())<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.Write(postData,0,&nbsp;postData.Length);<br />}<br />var&nbsp;response&nbsp;=(HttpWebResponse)request.GetResponse();<br /><span style="color: #0000FF; ">string</span>&nbsp;result;<br /><span style="color: #0000FF; ">using</span>(Stream&nbsp;stream&nbsp;=&nbsp;response.GetResponseStream())<br />{<br /><span style="color: #0000FF; ">if</span>(stream&nbsp;==<span style="color: #0000FF; ">null</span>)<br />returnstring.Empty;<br /><span style="color: #0000FF; ">using</span>(var&nbsp;reader&nbsp;=<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(stream,&nbsp;encoding))<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;reader.ReadToEnd();<br />}<br />}<br /><span style="color: #0000FF; ">return</span>&nbsp;result;<br />}<br />Post⽅法如下：<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">POST&nbsp;api/values</span><span style="color: #008000; "><br /></span>publicstringPost(dynamicvalue)<br />{<br /><span style="color: #0000FF; ">return</span>"value";<br />}<br />接收到Json字符串之后再反序列化即可。<br />结果如下图：<br />⼆、key/value形式发送<br />⾸先将实体转换为Dictionary类型，然后构造字符串发送，接⼝⽤实体接收，⽰例代码&nbsp;如下：<br />将实体转换为<br /><span style="color: #008000; ">//<br /></span>Dictionary&lt;<span style="color: #0000FF; ">string</span>,<span style="color: #0000FF; ">object</span>&gt;<br />var&nbsp;dic&nbsp;=&nbsp;JsonConvert.DeserializeObject&lt;Dictionary&lt;<span style="color: #0000FF; ">string</span>,<span style="color: #0000FF; ">object</span>&gt;&gt;(JsonConvert.SerializeObject(student));<br />&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;builder&nbsp;=<span style="color: #0000FF; ">new</span>&nbsp;StringBuilder();<br /><span style="color: #0000FF; ">foreach</span>(var&nbsp;item&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;dic)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.AppendFormat("{0}={1}&amp;",&nbsp;item.Key,&nbsp;item.Value);<br />}<br /><span style="color: #0000FF; ">string</span>&nbsp;url&nbsp;="http://localhost:34626/api/values";<br /><span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;WebHelper.HttpWebRequest(url,&nbsp;builder.ToString(),&nbsp;Encoding.GetEncoding("utf-8"));<br />采⽤这种⽅式发送需要对HttpWebRequest⽅法修改⼀⾏代码，如下：<br />修改如下代码<br /><span style="color: #008000; ">//<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;request.ContentType&nbsp;="application/x-www-form-urlencoded";<br />Post接⼝⽰例如下：<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">POST&nbsp;api/values</span><span style="color: #008000; "><br /></span>publicstringPost(Students&nbsp;value)<br />{<br /><span style="color: #0000FF; ">return</span>"value";<br />}<br />结果如下图：<br />虽然两种⽅式都能传递，但我还是⽐较喜欢序列化为Json格式之后发送，第⼆种⽅式对付简单的实体时⽐较好⽤，但是复杂的就不太好⽤<br />了。<br />ok<br />--------------------------------------------------------<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;</div><img src ="http://www.cnitblog.com/yide/aggbug/92599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-05-02 14:44 <a href="http://www.cnitblog.com/yide/archive/2022/05/02/92599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>net core 接口参数获取</title><link>http://www.cnitblog.com/yide/archive/2022/05/02/92598.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 02 May 2022 06:21:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/05/02/92598.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92598.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/05/02/92598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92598.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92598.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->一次HTTP请求，就是一次标准IO操作。请求是I，是输入；响应式O，是输出。任何web开发框架，其实都是在干这两件事：<br /><br />接受请求并进行解析获取参数<br />根据参数进行渲染并输出响应内容<br />所以我们学习一个框架，我认为最首要的是知道如何从请求中获取参数。http请求携带参数的地方主要有下面几个地方：<br /><br />URL<br />Header<br />Body<br />下面看看ASP.NET&nbsp;Core是如何从这几个位置获取参数的。<br />通过URL获取参数<br />通过URL传参是HTTP最最常用的办法。这里简单介绍下URL相关的知识。一个URL主要分成4个部分，以http:<span style="color: #008000; ">//</span><span style="color: #008000; ">localhost:5000/fromurl/test?name=mjzhou&amp;age=10为例：</span><span style="color: #008000; "><br /></span><br />http:<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;协议</span><span style="color: #008000; "><br /></span>localhost:5000&nbsp;&nbsp;&nbsp;&nbsp;主机地址<br />/fromurl/test&nbsp;&nbsp;&nbsp;&nbsp;PATH<br />name=mjzhou&amp;age=10&nbsp;&nbsp;&nbsp;&nbsp;QueryString<br />我们通常使用PATH跟QueryString来传递参数。新建一个MVC项目，新建一个Controller名为FromUrlController，通过几个Action来演示如何从URL上获取参数。&nbsp;&nbsp;&nbsp;&nbsp;<br />通过QuerySting获取参数<br />Request.Query对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;/fromurl/test?name=mjzhou</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;name&nbsp;=&nbsp;Request.Query["name"];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />Request.Query对象包含了本次请求的QueryString的键值对列表，所以可以通过它轻松获取QueryString上携带的参数。<br /><br />自动参数绑定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;/fromurl/test?name=mjzhou</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test1(<span style="color: #0000FF; ">string</span>&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />如果Action的型参的名称跟QueryString的Key一致，则MVC框架会自动帮我们绑定参数的值，不用手动获取。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test2([FromQuery(Name&nbsp;=&nbsp;"id")]<span style="color: #0000FF; ">string</span>&nbsp;bh)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(bh);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />如果参数绑定的名称跟QueryString的Key不一致，可以使用FromQueryAttribute强制指定绑定的Key的名称。<br /><br /><br />&nbsp;<br />通过PATH获取参数<br />Request.Path对象<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/fromurl/test3</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test3()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;path&nbsp;=&nbsp;Request.Path;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(path);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />Request.Path对象包含了本次http请求的Path的原始信息，一般可以通过/来分隔，手工获取想要的参数。<br /><br />自动参数绑定<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/fromurl/Test4/mjzhou/1000</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Route("FromUrl/test4/{name}/{id}")]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test4(<span style="color: #0000FF; ">string</span>&nbsp;name,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content($"{name}/{id}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />Path的自动参数绑定，需要配合RouteAttribute实现，RouteAttribute主要是指定一个Path的模板，通过这个模板可以告诉路由是否匹配这个Action，另外一个就是可以告诉参数绑定，如何解析这个path实现参数绑定。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Route("FromUrl/test6/{name}/{id}")]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test6([FromRoute(Name&nbsp;="name")]<span style="color: #0000FF; ">string</span>&nbsp;xm,&nbsp;[FromRoute(Name&nbsp;=&nbsp;"id")]<span style="color: #0000FF; ">int</span>&nbsp;bh)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content($"{xm}/{bh}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />如果Action的型参名称跟RouteAttribute模板的中的名称不一样，那么可以使用FromRoute强制指定解析的名称。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[HttpGet("FromUrl/test5/{name}/{id}")]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test5(<span style="color: #0000FF; ">string</span>&nbsp;name,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content($"{name}/{id}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />HttpGetAttribute、HttpPostAttribute等attribute同样可以完成RouteAttribute的效果，而且还指定了action接受的HTTP&nbsp;Method的方法，可以说是加强版的RouteAttribute。<br /><br />从Header上获取参数<br />添加一个FromHeaderController，通过几个action来演示如果从http&nbsp;headers上获取参数。<br /><br />Request.Headers对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;/FromHeader/test</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;myName&nbsp;=&nbsp;Request.Headers["myName"];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(myName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />Request.Headers是一个字典，包含了本次请求的Headers。所以我们可以通过Request.Headers对象轻松获取某个header的值。<br /><br />自动参数绑定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test1([FromHeader]<span style="color: #0000FF; ">string</span>&nbsp;myName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(myName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />通过在action的型参上打上FromHeaderAttribute，可以告诉框架自动从header获取参数。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test2([FromHeader(Name&nbsp;=&nbsp;"myName")]<span style="color: #0000FF; ">string</span>&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />如果action的型参跟header的key值不一致，可以通过FromHeaderAttribute强制指定匹配的header的key值。<br /><br />从Body获取参数<br />我们开发的时候经常通过表单提交数据，或者通过AJAX往后台提交一个JavaScript对象，本质上这些数据都是通过HTTP的Bady提交回去的。新建一个FromBodyController控制器，通过几个Action来演示如何获取Body的参数。<br /><br />Request.Body对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;model1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;NAME&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;async&nbsp;Task&lt;IActionResult&gt;&nbsp;Test()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Request.EnableBuffering();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;body&nbsp;=&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;stream&nbsp;=&nbsp;Request.Body;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(stream&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.Seek(0,&nbsp;SeekOrigin.Begin);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(var&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(stream,&nbsp;Encoding.UTF8,&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;1024,&nbsp;<span style="color: #0000FF; ">true</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;=&nbsp;await&nbsp;reader.ReadToEndAsync();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.Seek(0,&nbsp;SeekOrigin.Begin);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;model&nbsp;=&nbsp;JsonConvert.DeserializeObject&lt;model1&gt;(body);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(model.NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />Request.Body是一个Stream，保存了本次请求的body数据。所以我们只要把这个stream读出来，就能获取提交的数据。有了原始的数据，就可以通过反序列化等操作转换为模型，更简单的获取参数了。注意，ASP.NET&nbsp;Core想要读取这个对象，必须先调用Request.EnableBuffering()这个方法。<br />使用postman测试一下：<br />YiygVP.md.png<br /><br />参数自动绑定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test1([FromBody]model1&nbsp;model)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(model.NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />使用FromBodyAttribute可以把body的数据自动反序列化成型参的模型。但是请注意使用[FromBody]请求的Content-Type必须是application-json。<br />使用postman测试下：<br />Yica1e.md.png<br />Yicch8.md.png<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Test2([FromForm]model1&nbsp;model)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Content(model.NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />使用FromFormAttribute可以把body的数据自动反序列化成型参的模型。但是请注意使用[FromForm]请求的Content-Type必须是application/x-www-form-urlencoded。<br />使用postman测试下：<br />Yigkge.md.png<br />YigeHI.md.png<br /><br />总结<br />ASP.NET&nbsp;Core获取请求参数主要从URL，Headers，Body等位置获取。我们可以通过Request.Query、Request.Headers、Request.Body来手工获取数据。也可以通过[FromQuery]、[FromHeader]、[Frombody]等Attribute来实现参数的自动绑定。</div><img src ="http://www.cnitblog.com/yide/aggbug/92598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-05-02 14:21 <a href="http://www.cnitblog.com/yide/archive/2022/05/02/92598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#后台调用web接口（GET, POST）</title><link>http://www.cnitblog.com/yide/archive/2022/04/25/92595.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 25 Apr 2022 05:51:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/04/25/92595.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92595.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/04/25/92595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92595.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92595.html</trackback:ping><description><![CDATA[<br />测试地址：<span style="background-color: #ffffff;">https://date.nager.at/api/v2/PublicHolidays/2020/US</span><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;1.get方法调用接口获取json文件内容<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;GetFunction()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;serviceAddress&nbsp;=&nbsp;"http://222.111.999.444:8687/tttr/usercrd/12/b7e50cb45a?userid=9999";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;request&nbsp;=&nbsp;(HttpWebRequest)WebRequest.Create(serviceAddress);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Method&nbsp;=&nbsp;"GET";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.ContentType&nbsp;=&nbsp;"text/html;charset=UTF-8";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebResponse&nbsp;response&nbsp;=&nbsp;(HttpWebResponse)request.GetResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;myResponseStream&nbsp;=&nbsp;response.GetResponseStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;myStreamReader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(myResponseStream,&nbsp;Encoding.UTF8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;retString&nbsp;=&nbsp;myStreamReader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStreamReader.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myResponseStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(retString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.post方法调用接口获取json文件内容<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;PostFunction()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;serviceAddress&nbsp;=&nbsp;"http://222.111.999.444:8687/tttr/usercrd/uuu/12/dfd7e4";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;request&nbsp;=&nbsp;(HttpWebRequest)WebRequest.Create(serviceAddress);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Method&nbsp;=&nbsp;"POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.ContentType&nbsp;=&nbsp;"application/json";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;strContent&nbsp;=&nbsp;@"{&nbsp;""mmmm"":&nbsp;""89e"",""nnnnnn"":&nbsp;""0101943"",""kkkkkkk"":&nbsp;""e8sodijf9""}";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(StreamWriter&nbsp;dataStream&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamWriter(request.GetRequestStream()))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataStream.Write(strContent);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebResponse&nbsp;response&nbsp;=&nbsp;(HttpWebResponse)request.GetResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;encoding&nbsp;=&nbsp;response.ContentEncoding;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(encoding&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;||&nbsp;encoding.Length&nbsp;&lt;&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding&nbsp;=&nbsp;"UTF-8";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">默认编码&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(response.GetResponseStream(),&nbsp;Encoding.GetEncoding(encoding));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;retString&nbsp;=&nbsp;reader.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">解析josn</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JObject&nbsp;jo&nbsp;=&nbsp;JObject.Parse(retString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(jo["message"]["mmmm"].ToString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</div><img src ="http://www.cnitblog.com/yide/aggbug/92595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-04-25 13:51 <a href="http://www.cnitblog.com/yide/archive/2022/04/25/92595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net 后端调用接口</title><link>http://www.cnitblog.com/yide/archive/2022/04/24/92594.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Sun, 24 Apr 2022 10:25:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/04/24/92594.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92594.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/04/24/92594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92594.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92594.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;HttpRequestDemo<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;请求方式&nbsp;post&nbsp;提交&nbsp;json格式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;对应的服务端接口接收&nbsp;Task</span><span style="color: #808080; ">&lt;JsonResult&gt;</span><span style="color: #008000; ">&nbsp;Login(model&nbsp;m)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;JsonFormatRequest()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">参数对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;platform&nbsp;=&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userName&nbsp;=&nbsp;"xxxxxx",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;=&nbsp;"xxxxxx"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">将对象参数序列化成json字符串&nbsp;，也可以自己手动拼接</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;jsonStr&nbsp;=&nbsp;Newtonsoft.Json.JsonConvert.SerializeObject(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;bs&nbsp;=&nbsp;Encoding.Default.GetBytes(jsonStr);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;req&nbsp;=&nbsp;(HttpWebRequest)HttpWebRequest.Create(@"http://xxx.com/Api/User/Login");<span style="color: #008000; ">//</span><span style="color: #008000; ">接口地址</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Method&nbsp;=&nbsp;"POST";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">请求类型</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentType&nbsp;=&nbsp;"application/json";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentLength&nbsp;=&nbsp;bs.Length;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">获得请求流</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(Stream&nbsp;reqStream&nbsp;=&nbsp;req.GetRequestStream())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">参数写入请求流</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Write(bs,&nbsp;0,&nbsp;bs.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">从返回结果流中读取返回数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;sr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(req.GetResponse().GetResponseStream(),&nbsp;Encoding.UTF8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;sr.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(result);<span style="color: #008000; ">//</span><span style="color: #008000; ">打印返回信息&nbsp;结果可用Newtonsoft.Json.JsonConvert.DeserializeObject&nbsp;序列化成自己想要的对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;请求方式&nbsp;Post&nbsp;提交&nbsp;body&nbsp;如&nbsp;&amp;name=123&amp;xxx&nbsp;&nbsp;方式传参<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;对应的服务端接收参数&nbsp;Task</span><span style="color: #808080; ">&lt;JsonResult&gt;</span><span style="color: #008000; ">&nbsp;Login([FromForm]model&nbsp;m)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;QueryBodyRequest()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">拼接的即将传入的参数对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;queryStr&nbsp;=&nbsp;"&amp;phone=xxxxx&amp;key=xxxxxx&amp;password=xxxx&amp;type=2";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;bs&nbsp;=&nbsp;Encoding.Default.GetBytes(queryStr);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;req&nbsp;=&nbsp;(HttpWebRequest)HttpWebRequest.Create(@"http://xxx.com/account/login");<span style="color: #008000; ">//</span><span style="color: #008000; ">接口地址</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.Method&nbsp;=&nbsp;"POST";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentType&nbsp;=&nbsp;"application/x-www-form-urlencoded";&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.ContentLength&nbsp;=&nbsp;bs.Length;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">请求数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;(Stream&nbsp;reqStream&nbsp;=&nbsp;req.GetRequestStream())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">写入流数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Write(bs,&nbsp;0,&nbsp;bs.Length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqStream.Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">从返回结果流中读取数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;sr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StreamReader(req.GetResponse().GetResponseStream(),&nbsp;Encoding.UTF8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;result&nbsp;=&nbsp;sr.ReadToEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(result);<span style="color: #008000; ">//</span><span style="color: #008000; ">打印返回信息&nbsp;结果可用Newtonsoft.Json.JsonConvert.DeserializeObject&nbsp;序列化成自己想要的对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;请求方式&nbsp;Post&nbsp;提交&nbsp;Body&nbsp;方式2&nbsp;效果同上方法&nbsp;底层也是&nbsp;&amp;name=123&amp;xxx&nbsp;方式传参<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;对应的服务端接收参数&nbsp;Task</span><span style="color: #808080; ">&lt;JsonResult&gt;</span><span style="color: #008000; ">&nbsp;Login([FromBody]model&nbsp;m)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;BodyFormatRequest()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpClient&nbsp;myHttpClient&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;url&nbsp;=&nbsp;"http://www.xxxxx.com/account/login";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;content&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FormUrlEncodedContent(<span style="color: #0000FF; ">new</span>&nbsp;Dictionary&lt;<span style="color: #0000FF; ">string</span>,&nbsp;<span style="color: #0000FF; ">string</span>&gt;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"phone","18888888"},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"key","CF6D9D9766665367700F9249AD080E9FF9D9"&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"password","123123"&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"type","2"&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpResponseMessage&nbsp;response&nbsp;=&nbsp;myHttpClient.PostAsync(url,&nbsp;content).Result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;response.Content.ReadAsByteArrayAsync().Result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(Encoding.UTF8.GetString(result));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;ex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(ex.Message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><img src ="http://www.cnitblog.com/yide/aggbug/92594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-04-24 18:25 <a href="http://www.cnitblog.com/yide/archive/2022/04/24/92594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net core 使用api client 调用api</title><link>http://www.cnitblog.com/yide/archive/2022/04/24/92593.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Sun, 24 Apr 2022 09:38:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/04/24/92593.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92593.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/04/24/92593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92593.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92593.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Create&nbsp;Some&nbsp;APIs&nbsp;<br /><br />Here&nbsp;I&nbsp;use&nbsp;ASP.NET&nbsp;Core&nbsp;WebAPI&nbsp;to&nbsp;creat&nbsp;some&nbsp;RESTful&nbsp;APIs.<br /><br />[Route("api/[controller]")]&nbsp;&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;PersonsController&nbsp;:&nbsp;Controller&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;GET:&nbsp;api/persons&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;[HttpGet]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IEnumerable&nbsp;Get()&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person{Id&nbsp;=&nbsp;1&nbsp;,&nbsp;Name&nbsp;=&nbsp;"catcher&nbsp;wong"},&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person{Id&nbsp;=&nbsp;2&nbsp;,&nbsp;Name&nbsp;=&nbsp;"james"}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;GET&nbsp;api/persons/5&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;[HttpGet("{id}")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Person&nbsp;Get(<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person&nbsp;{&nbsp;Id&nbsp;=&nbsp;id,&nbsp;Name&nbsp;=&nbsp;"name"&nbsp;};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;POST&nbsp;api/persons&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;[HttpPost]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Person&nbsp;Post([FromBody]Person&nbsp;person)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(person&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person&nbsp;{&nbsp;Id&nbsp;=&nbsp;person.Id,&nbsp;Name&nbsp;=&nbsp;person.Name&nbsp;};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;PUT&nbsp;api/persons/&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;[HttpPut]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Put([FromBody]<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;$"put&nbsp;{id}";&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;DELETE&nbsp;api/persons/5&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;[HttpDelete("{id}")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Delete(<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;$"del&nbsp;{id}";&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br />Interface&nbsp;Declaration<br /><br />Create&nbsp;an&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;named&nbsp;IPersonApiClient&nbsp;which&nbsp;inherit&nbsp;from&nbsp;IHttpApiClient.<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IPersonApiClient&nbsp;:&nbsp;IHttpApiClient&nbsp;{&nbsp;}&nbsp;&nbsp;<br />Add&nbsp;some&nbsp;methods&nbsp;that&nbsp;need&nbsp;to&nbsp;call&nbsp;APIs.<br /><br />Every&nbsp;method&nbsp;must&nbsp;have&nbsp;a&nbsp;HTTP&nbsp;attribute&nbsp;that&nbsp;provides&nbsp;the&nbsp;request&nbsp;method&nbsp;and&nbsp;relative&nbsp;URL.&nbsp;The&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;type&nbsp;should&nbsp;be&nbsp;ITask.<br /><br />[HttpGet("/api/persons")]&nbsp;&nbsp;&nbsp;&nbsp;<br />ITask&gt;&nbsp;GetPersonsAsync();&nbsp;&nbsp;&nbsp;&nbsp;<br />A&nbsp;request&nbsp;URL&nbsp;can&nbsp;be&nbsp;updated&nbsp;dynamically&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;replacement&nbsp;blocks&nbsp;and&nbsp;parameters&nbsp;on&nbsp;the&nbsp;method.&nbsp;A&nbsp;replacement&nbsp;block&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;an&nbsp;alphanumeric&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;surrounded&nbsp;by&nbsp;{&nbsp;and&nbsp;}.<br /><br />[HttpGet("/api/persons/{id}")]&nbsp;&nbsp;<br />ITask&nbsp;GetPersonAsync(<span style="color: #0000FF; ">int</span>&nbsp;id);&nbsp;&nbsp;<br />When&nbsp;our&nbsp;requst&nbsp;parameters&nbsp;should&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;request&nbsp;body,&nbsp;we&nbsp;can&nbsp;use&nbsp;some&nbsp;attributes&nbsp;to&nbsp;specify&nbsp;the&nbsp;content,&nbsp;such&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;JsonContent,&nbsp;FormContent&nbsp;.etc.<br /><br />[HttpPost("/api/persons")]&nbsp;&nbsp;<br />ITask&nbsp;AddPersonAsync([JsonContent]Person&nbsp;person);&nbsp;&nbsp;&nbsp;<br />The&nbsp;following&nbsp;code&nbsp;demonstrates&nbsp;the&nbsp;basic&nbsp;usage.<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IPersonApiClient&nbsp;:&nbsp;IHttpApiClient&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;[HttpGet("/api/persons")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ITask&gt;&nbsp;GetPersonsAsync();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;[HttpGet("/api/persons/{id}")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ITask&nbsp;GetPersonAsync(<span style="color: #0000FF; ">int</span>&nbsp;id);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;[HttpPost("/api/persons")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ITask&nbsp;AddPersonAsync([JsonContent]Person&nbsp;person);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;[HttpPut("/api/persons")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ITask&nbsp;EditPersonAsync([JsonContent]<span style="color: #0000FF; ">int</span>&nbsp;id);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;[HttpDelete("/api/persons/{id}")]&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ITask&nbsp;DeletePersonAsync(<span style="color: #0000FF; ">int</span>&nbsp;id);&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br />The&nbsp;next&nbsp;step&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;how&nbsp;to&nbsp;retrieve&nbsp;the&nbsp;response&nbsp;of&nbsp;the&nbsp;request.<br /><br />Retrieving&nbsp;Response<br /><br />We&nbsp;should&nbsp;create&nbsp;a&nbsp;client&nbsp;first.&nbsp;After&nbsp;creating&nbsp;,&nbsp;what&nbsp;we&nbsp;need&nbsp;to&nbsp;<span style="color: #0000FF; ">do</span>&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;call&nbsp;the&nbsp;methods&nbsp;we&nbsp;declared&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;the&nbsp;<span style="color: #0000FF; ">interface</span>.<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">specify&nbsp;the&nbsp;config&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>var&nbsp;config&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpApiConfig&nbsp;&nbsp;<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HttpHost&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri("http://localhost:9999"),&nbsp;&nbsp;<br />};&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />var&nbsp;client&nbsp;=&nbsp;HttpApiClient.Create(config);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />var&nbsp;persons&nbsp;=&nbsp;await&nbsp;client.GetPersonsAsync();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />Console.WriteLine("GetPersonsAsync&nbsp;result:");&nbsp;&nbsp;<br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;item&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;persons)&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine($"{item.Id}-{item.Name}");&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />var&nbsp;person&nbsp;=&nbsp;await&nbsp;client.GetPersonAsync(1000);&nbsp;&nbsp;<br />Console.WriteLine("GetPersonAsync&nbsp;result:");&nbsp;&nbsp;<br />Console.WriteLine($"{person.Id}-{person.Name}");&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />var&nbsp;newPerson&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person&nbsp;{&nbsp;Id&nbsp;=&nbsp;999,&nbsp;Name&nbsp;=&nbsp;"999"&nbsp;};&nbsp;&nbsp;<br />var&nbsp;postResult&nbsp;=&nbsp;await&nbsp;client.AddPersonAsync(newPerson);&nbsp;&nbsp;<br />Console.WriteLine("AddPersonAsync&nbsp;result:");&nbsp;&nbsp;<br />Console.WriteLine($"{postResult.Id}-{postResult.Name}");&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />var&nbsp;editResult&nbsp;=&nbsp;await&nbsp;client.EditPersonAsync(1);&nbsp;&nbsp;<br />Console.WriteLine("EditPersonAsync&nbsp;result:");&nbsp;&nbsp;<br />Console.WriteLine($"{editResult}");&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />var&nbsp;delResult&nbsp;=&nbsp;await&nbsp;client.DeletePersonAsync(1);&nbsp;&nbsp;<br />Console.WriteLine("DeletePersonAsync&nbsp;result:");&nbsp;&nbsp;<br />Console.WriteLine($"{delResult}");&nbsp;&nbsp;<br />&nbsp;</div><img src ="http://www.cnitblog.com/yide/aggbug/92593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-04-24 17:38 <a href="http://www.cnitblog.com/yide/archive/2022/04/24/92593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net core 调用外部api</title><link>http://www.cnitblog.com/yide/archive/2022/04/24/92592.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Sun, 24 Apr 2022 09:29:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/04/24/92592.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92592.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/04/24/92592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92592.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92592.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->第三方&nbsp;API&nbsp;概览<br />我们将开发一个允许用户输入国家代码和年份的应用程序，然后我们将调用第三方&nbsp;API&nbsp;来获取该特定国家在该特定年份的公共假期列表。我们将使用的第三方&nbsp;API&nbsp;称为&nbsp;Nager.Date，这是一个全球公共假期&nbsp;API。<br />在这里插入图片描述<br />这是一个非常简单的&nbsp;API，您可以通过输入以下&nbsp;URL&nbsp;在&nbsp;Postman&nbsp;中轻松测试此&nbsp;API。<br />https:<span style="color: #008000; ">//</span><span style="color: #008000; ">date.nager.at/api/v2/PublicHolidays/2020/US</span><span style="color: #008000; "><br /></span><br />该&nbsp;API&nbsp;的响应是&nbsp;JSON&nbsp;格式的公共假期列表，如下所示：<br />在这里插入图片描述<br /><br />了解&nbsp;HttpClient&nbsp;对象<br />允许我们在&nbsp;ASP.NET&nbsp;Core&nbsp;应用程序中使用第三方&nbsp;API&nbsp;的最常见和众所周知的类是&nbsp;HttpClient&nbsp;类。此类使我们能够向第三方&nbsp;API&nbsp;发送&nbsp;HTTP&nbsp;请求并接收从这些&nbsp;API&nbsp;返回的&nbsp;HTTP&nbsp;响应。&nbsp;HttpClient&nbsp;的每个实例都维护着自己的连接池，这使得它可以将自己的请求与其他&nbsp;HttpClient&nbsp;实例执行的请求隔离开来。此类还充当更特定&nbsp;HTTP&nbsp;客户端的基类。例如，您可以创建&nbsp;FacebookHttpClient&nbsp;或&nbsp;TwitterHttpClient&nbsp;作为基本&nbsp;HttpClient&nbsp;的子类，并且可以使用这些特定的&nbsp;HTTP&nbsp;客户端与&nbsp;Facebook&nbsp;和&nbsp;Twitter&nbsp;API&nbsp;进行通信。<br /><br />建议创建一个&nbsp;HttpClient&nbsp;实例并在整个应用程序生命周期中重复使用它。这是因为为每个请求实例化一个新的&nbsp;HttpClient&nbsp;实例很容易耗尽重负载下可用的套接字数量。这主要是因为当&nbsp;HttpClient&nbsp;对象被释放，底层套接字不会立即释放。&nbsp;您可以阅读这篇精彩的博客文章您使用&nbsp;HttpClient&nbsp;错误，这会破坏您的软件的稳定性，以获取有关我刚刚提到的问题的更多信息。<br /><br />在&nbsp;ASP.NET&nbsp;Core&nbsp;中使用&nbsp;HttpClient<br />正如我上面提到的，我们将创建一个应用程序，允许用户查看任何国家/地区的公共假期列表。让我们创建一个&nbsp;ASP.NET&nbsp;Core&nbsp;MVC&nbsp;Web&nbsp;应用程序并创建以下接口。这个接口只有一个&nbsp;GetHolidays&nbsp;方法，它有两个参数&nbsp;countryCode&nbsp;和&nbsp;year，我们很快就会从用户那里收到。<br /><br />public&nbsp;interface&nbsp;IHolidaysApiService<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Task&lt;List&lt;HolidayModel&gt;&gt;&nbsp;GetHolidays(string&nbsp;countryCode,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;year);<br />}<br />上面的&nbsp;GetHolidays&nbsp;方法返回一个&nbsp;HolidayModel&nbsp;列表，它是一个模型类，具有与&nbsp;Nager.Date&nbsp;API&nbsp;的响应映射的属性。<br /><br />public&nbsp;class&nbsp;HolidayModel<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;Name&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;LocalName&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;DateTime?&nbsp;Date&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;CountryCode&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;Global&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />}<br />接下来，我们需要实现一个&nbsp;HolidaysApiService&nbsp;类，该类将实现上面声明的&nbsp;IHolidaysApiService。请注意我是如何在类中声明私有和静态&nbsp;HttpClient&nbsp;变量的，以及它是如何在类的静态构造函数中定义的。这是&nbsp;Microsoft&nbsp;官方文档中提到的创建&nbsp;HttpClient&nbsp;实例的推荐方法。<br /><br />public&nbsp;class&nbsp;HolidaysApiService&nbsp;:&nbsp;IHolidaysApiService<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;readonly&nbsp;HttpClient&nbsp;client;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;HolidaysApiService()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpClient()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BaseAddress&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri("https://date.nager.at")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />接下来我们需要定义&nbsp;GetHolidays&nbsp;方法，如下所示：<br /><br />public&nbsp;async&nbsp;Task&lt;List&lt;HolidayModel&gt;&gt;&nbsp;GetHolidays(string&nbsp;countryCode,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;year)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;string.Format("/api/v2/PublicHolidays/{0}/{1}",&nbsp;year,&nbsp;countryCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;HolidayModel&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;response&nbsp;=&nbsp;await&nbsp;client.GetAsync(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(response.IsSuccessStatusCode)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;stringResponse&nbsp;=&nbsp;await&nbsp;response.Content.ReadAsStringAsync();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;JsonSerializer.Deserialize&lt;List&lt;HolidayModel&gt;&gt;(stringResponse,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JsonSerializerOptions()&nbsp;{&nbsp;PropertyNamingPolicy&nbsp;=&nbsp;JsonNamingPolicy.CamelCase&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpRequestException(response.ReasonPhrase);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />}<br />上面的方法发生了很多事情，所以让我详细解释一下：<br /><br />第一行是构建&nbsp;Nager.Date&nbsp;API&nbsp;的&nbsp;URL&nbsp;并使用&nbsp;year&nbsp;和&nbsp;countryCode&nbsp;参数<br /><span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;string.Format("/api/v2/PublicHolidays/{0}/{1}",&nbsp;year,&nbsp;countryCode);<br />接下来，我们将使用&nbsp;GetAsync&nbsp;方法进行&nbsp;API&nbsp;调用，该方法将&nbsp;GET&nbsp;请求作为异步操作发送到指定的&nbsp;Uri。该方法返回&nbsp;System.Net.Http.HttpResponseMessage&nbsp;对象，该对象表示包含状态代码和数据的&nbsp;HTTP&nbsp;响应消息。<br /><span style="color: #0000FF; ">var</span>&nbsp;response&nbsp;=&nbsp;await&nbsp;client.GetAsync(url);<br />接下来，我们调用&nbsp;ReadAsStringAsync&nbsp;方法将&nbsp;HTTP&nbsp;内容序列化为字符串<br /><span style="color: #0000FF; ">var</span>&nbsp;stringResponse&nbsp;=&nbsp;await&nbsp;response.Content.ReadAsStringAsync();<br />最后，我们使用&nbsp;JsonSerializer&nbsp;将&nbsp;JSON&nbsp;响应字符串反序列化为&nbsp;HolidayModel&nbsp;对象列表。<br />result&nbsp;=&nbsp;JsonSerializer.Deserialize&lt;List&lt;HolidayModel&gt;&gt;(stringResponse,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JsonSerializerOptions()&nbsp;{&nbsp;PropertyNamingPolicy&nbsp;=&nbsp;JsonNamingPolicy.CamelCase&nbsp;});<br />这就是我们使用第三方公共假期&nbsp;API&nbsp;所需的全部内容。要使用我们的&nbsp;HolidaysApiService，我们需要首先在&nbsp;Startup.cs&nbsp;类中注册我们的服务。<br /><br />public&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;ConfigureServices(IServiceCollection&nbsp;services)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;services.AddControllersWithViews();<br />&nbsp;&nbsp;&nbsp;&nbsp;services.AddSingleton&lt;IHolidaysApiService,&nbsp;HolidaysApiService&gt;();<br />}<br />接下来，我们可以在&nbsp;HomeController&nbsp;中注入我们的&nbsp;HolidaysApiService&nbsp;并通过传递我们将在&nbsp;Index&nbsp;action&nbsp;方法中接收的&nbsp;countryCode&nbsp;和&nbsp;year&nbsp;参数来调用&nbsp;GetHolidays&nbsp;方法。<br /><br />public&nbsp;class&nbsp;HomeController&nbsp;:&nbsp;Controller<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;readonly&nbsp;IHolidaysApiService&nbsp;_holidaysApiService;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;HomeController(IHolidaysApiService&nbsp;holidaysApiService)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_holidaysApiService&nbsp;=&nbsp;holidaysApiService;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;async&nbsp;Task&lt;IActionResult&gt;&nbsp;Index(string&nbsp;countryCode,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;year)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;HolidayModel&gt;&nbsp;holidays&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;HolidayModel&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;holidays&nbsp;=&nbsp;await&nbsp;_holidaysApiService.GetHolidays(countryCode,&nbsp;year);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;View(holidays);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />最后，我们需要一个&nbsp;Razor&nbsp;视图来创建一个表单，用户将在其中输入国家代码和年份。表单将提交给上述&nbsp;Index&nbsp;操作，然后该操作将调用&nbsp;GetHolidays&nbsp;方法。这是&nbsp;Index.cshtml&nbsp;Razor&nbsp;视图的代码，显示了一个&nbsp;HTML&nbsp;表单和一个用于显示公共假期的表格。<br /><br />@model&nbsp;List&lt;HolidayModel&gt;<br />@{<br />&nbsp;&nbsp;&nbsp;&nbsp;ViewData["Title"]&nbsp;=&nbsp;"Home&nbsp;Page";<br />}<br />&nbsp;<br />&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;h3&nbsp;class="display-4"&gt;Public&nbsp;Holidays&nbsp;Finder&lt;/h3&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;center&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&nbsp;asp-controller="Home"&nbsp;asp-action="Index"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Country&nbsp;Code:&nbsp;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type="text"&nbsp;id="txtCountryCode"&nbsp;name="CountryCode"&nbsp;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Year:&nbsp;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type="text"&nbsp;id="txtYear"&nbsp;name="Year"&nbsp;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;input&nbsp;type="submit"&nbsp;value="Submit"&nbsp;/&gt;&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;hr&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/center&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;@<span style="color: #0000FF; ">if</span>&nbsp;(Model&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;Model.Count&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&nbsp;class="table&nbsp;table-bordered&nbsp;table-striped&nbsp;table-sm"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;thead&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Date&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Name&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Local&nbsp;Name&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Country&nbsp;Code&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Global&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/thead&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tbody&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@foreach&nbsp;(<span style="color: #0000FF; ">var</span>&nbsp;item&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;Model)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;@item.Date.Value.ToShortDateString()&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;@Html.DisplayFor(modelItem&nbsp;=&gt;&nbsp;item.Name)&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;@Html.DisplayFor(modelItem&nbsp;=&gt;&nbsp;item.LocalName)&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;@Html.DisplayFor(modelItem&nbsp;=&gt;&nbsp;item.CountryCode)&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;@Html.DisplayFor(modelItem&nbsp;=&gt;&nbsp;item.Global)&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tbody&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;/div&gt;<br />现在是时候测试我们的应用程序，看看我们是否能够使用第三方&nbsp;API。在&nbsp;Visual&nbsp;Studio&nbsp;中按&nbsp;F5，您将看到类似于以下内容的页面。您可以输入国家代码，例如美国、德国等，以及一年，例如2021，然后单击&#8220;提交&#8221;按钮，如果一切顺利，您将看到我们的代码调用第三方&nbsp;API，从&nbsp;API&nbsp;中获取公共假期列表并将其显示在页面上。<br />在这里插入图片描述<br /><br />使用&nbsp;IHttpClientFactory&nbsp;管理&nbsp;HttpClient&nbsp;对象<br />为了使&nbsp;HttpClient&nbsp;实例易于管理，并避免上述套接字耗尽问题，.NET&nbsp;Core&nbsp;2.1&nbsp;引入了&nbsp;IHttpClientFactory&nbsp;接口，可用于通过依赖注入&nbsp;(DI)&nbsp;在应用程序中配置和创建&nbsp;HttpClient&nbsp;实例。为了使用&nbsp;IHttpClientFactory，我们可以通过调用&nbsp;AddHttpClient(IServiceCollection)&nbsp;在&nbsp;Startup.cs&nbsp;文件中注册它。<br /><br />public&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;ConfigureServices(IServiceCollection&nbsp;services)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;services.AddControllersWithViews();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;services.AddSingleton&lt;IHolidaysApiService,&nbsp;HolidaysApiService&gt;();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;services.AddHttpClient("PublicHolidaysApi",&nbsp;c&nbsp;=&gt;&nbsp;c.BaseAddress&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri("https://date.nager.at"));<br />}<br />可以使用&nbsp;AddHttpClient&nbsp;方法注册多个具有不同名称的&nbsp;HTTP&nbsp;客户端。&nbsp;AddHttpClient&nbsp;方法的第一个参数是客户端的名称，第二个参数是将配置&nbsp;HttpClient&nbsp;的&nbsp;Lamba&nbsp;表达式。在上面的示例中，我使用要使用此特定&nbsp;HTTP&nbsp;客户端调用的第三方&nbsp;API&nbsp;的&nbsp;URL&nbsp;来设置&nbsp;BaseAddress&nbsp;属性。<br /><br />一旦&nbsp;HTTP&nbsp;客户端被注册，我们就可以在我们的控制器和服务中注入&nbsp;IHttpClientFactory&nbsp;并调用它的&nbsp;CreateClient&nbsp;方法来创建我们想要在我们的代码中使用的特定&nbsp;HTTP&nbsp;客户端对象。&nbsp;CreateClient&nbsp;方法需要您要创建的&nbsp;HTTP&nbsp;客户端的名称，如下所示：<br /><br />public&nbsp;class&nbsp;HolidaysApiService&nbsp;:&nbsp;IHolidaysApiService<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;readonly&nbsp;HttpClient&nbsp;client;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;HolidaysApiService(IHttpClientFactory&nbsp;clientFactory)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client&nbsp;=&nbsp;clientFactory.CreateClient("PublicHolidaysApi");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;async&nbsp;Task&lt;List&lt;HolidayModel&gt;&gt;&nbsp;GetHolidays(string&nbsp;countryCode,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;year)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;url&nbsp;=&nbsp;string.Format("/api/v2/PublicHolidays/{0}/{1}",&nbsp;year,&nbsp;countryCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;HolidayModel&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;response&nbsp;=&nbsp;await&nbsp;client.GetAsync(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(response.IsSuccessStatusCode)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;stringResponse&nbsp;=&nbsp;await&nbsp;response.Content.ReadAsStringAsync();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;JsonSerializer.Deserialize&lt;List&lt;HolidayModel&gt;&gt;(stringResponse,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JsonSerializerOptions()&nbsp;{&nbsp;PropertyNamingPolicy&nbsp;=&nbsp;JsonNamingPolicy.CamelCase&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpRequestException(response.ReasonPhrase);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />总结概括<br />在本文中，我向您概述了&nbsp;HttpClient，并提供了直接或使用&nbsp;IHttpClientFactory&nbsp;创建&nbsp;HttpClient&nbsp;对象的示例。我还向您展示了一个使用&nbsp;HttpClient&nbsp;调用第三方&nbsp;Web&nbsp;API&nbsp;的示例。希望您现在熟悉&nbsp;HttpClient&nbsp;对象及其用法，并且可以放心地开始在您的项目中使用它。</div><img src ="http://www.cnitblog.com/yide/aggbug/92592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-04-24 17:29 <a href="http://www.cnitblog.com/yide/archive/2022/04/24/92592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net Api 接口调用 增删改查</title><link>http://www.cnitblog.com/yide/archive/2022/04/24/92591.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Sun, 24 Apr 2022 09:21:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/04/24/92591.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92591.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/04/24/92591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92591.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92591.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->.net&nbsp;Api&nbsp;接口调用&nbsp;增删改查<br />.net&nbsp;Api项目搭建内容以前已经说过了，文章链接，这篇文章在已经搭建好项目基础上简单说下如何建立API增删改查接口。<br /><br />在Models中建立一个实体类：<br /><br />namespace&nbsp;ApiTest.Models<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;Product<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Id&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;Name&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;Category&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;decimal&nbsp;Price&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />处理数据的接口放在Models中：<br /><br />namespace&nbsp;ApiTest.Models<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;interface&nbsp;IProductRepository<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEnumerable&lt;Product&gt;&nbsp;GetAll();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Product&nbsp;Get(<span style="color: #0000FF; ">int</span>&nbsp;id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Product&nbsp;Add(Product&nbsp;item);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(<span style="color: #0000FF; ">int</span>&nbsp;id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;Update(Product&nbsp;item);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />业务处理的接口实现类也放在Models中：<br /><br />namespace&nbsp;ApiTest.Models<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;ProductRepository:IProductRepository<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&lt;Product&gt;&nbsp;products&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;Product&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;_nextId&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ProductRepository()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.Add(<span style="color: #0000FF; ">new</span>&nbsp;Product&nbsp;{&nbsp;Id&nbsp;=&nbsp;0,&nbsp;Name&nbsp;=&nbsp;"Tomato&nbsp;soup",&nbsp;Category&nbsp;=&nbsp;"Groceries",&nbsp;Price&nbsp;=&nbsp;1.39M&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.Add(<span style="color: #0000FF; ">new</span>&nbsp;Product&nbsp;{&nbsp;Id&nbsp;=&nbsp;1,&nbsp;Name&nbsp;=&nbsp;"Yo-yo",&nbsp;Category&nbsp;=&nbsp;"Toys",&nbsp;Price&nbsp;=&nbsp;3.75M&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.Add(<span style="color: #0000FF; ">new</span>&nbsp;Product&nbsp;{&nbsp;Id&nbsp;=&nbsp;2,&nbsp;Name&nbsp;=&nbsp;"Hammer",&nbsp;Category&nbsp;=&nbsp;"Hardware",&nbsp;Price&nbsp;=&nbsp;16.99M&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IEnumerable&lt;Product&gt;&nbsp;GetAll()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;products;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Product&nbsp;Get(<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;products.Find(p=&gt;p.Id==id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Product&nbsp;Add(Product&nbsp;item)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(item&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArgumentNullException("item");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.Id&nbsp;=&nbsp;_nextId++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.Add(item);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;item;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(<span style="color: #0000FF; ">int</span>&nbsp;id)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.RemoveAll(p=&gt;p.Id==id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;Update(Product&nbsp;item)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(item==<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArgumentNullException("item");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index&nbsp;=&nbsp;products.FindIndex(p=&gt;p.Id==item.Id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(index&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.RemoveAt(index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;products.Add(item);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />在Controllers中新建ProductController：<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">这里路由处理根据http协议</span><span style="color: #008000; "><br /></span>namespace&nbsp;ApiTest.Controllers<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;ProductsController&nbsp;:&nbsp;ApiController<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;readonly&nbsp;IProductRepository&nbsp;repository&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ProductRepository();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">GET:&nbsp;&nbsp;/api/products</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IEnumerable&lt;Product&gt;&nbsp;GetAllProducts()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;repository.GetAll();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">GET:&nbsp;/api/products/id</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Product&nbsp;GetProduct(<span style="color: #0000FF; ">int</span>&nbsp;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Product&nbsp;item&nbsp;=&nbsp;repository.Get(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(item&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpResponseException(HttpStatusCode.NotFound);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;item;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">GET:&nbsp;/api/products?category=Groceries</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IEnumerable&lt;Product&gt;&nbsp;GetProductsByCategory(string&nbsp;category)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;repository.GetAll().Where(p&nbsp;=&gt;&nbsp;string.Equals(p.Category,&nbsp;category,&nbsp;StringComparison.OrdinalIgnoreCase));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">POST:&nbsp;/api/products</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;HttpResponseMessage&nbsp;PostProduct(Product&nbsp;item)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;=&nbsp;repository.Add(item);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;response&nbsp;=&nbsp;Request.CreateResponse&lt;Product&gt;(HttpStatusCode.Created,&nbsp;item);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;uri&nbsp;=&nbsp;Url.Link("DefaultApi",&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;id&nbsp;=&nbsp;item.Id&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.Headers.Location&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri(uri);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;response;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">PUT:&nbsp;/api/products/id</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;PutProduct(<span style="color: #0000FF; ">int</span>&nbsp;id,&nbsp;Product&nbsp;product)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;product.Id&nbsp;=&nbsp;id;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!repository.Update(product))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpResponseException(HttpStatusCode.NotFound);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Delete:&nbsp;/api/products/id</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;DeleteProduct(<span style="color: #0000FF; ">int</span>&nbsp;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Product&nbsp;item&nbsp;=&nbsp;repository.Get(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(item&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HttpResponseException(HttpStatusCode.NotFound);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repository.Remove(id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />在Views中的Home中修改原有的index文件：<br /><br />&lt;script&nbsp;src="~/Content/jquery-3.1.1.js"&gt;&lt;/script&gt;<br />&lt;div&nbsp;id="body"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;section&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;添加记录&lt;/h2&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&lt;input&nbsp;id="name"&nbsp;type="text"&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category:&lt;input&nbsp;id="category"&nbsp;type="text"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Price:&lt;input&nbsp;id="price"&nbsp;type="text"&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;id="addItem"&nbsp;type="button"&nbsp;value="添加"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/section&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;section&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;修改记录&lt;/h2&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Id：&lt;input&nbsp;id="id2"&nbsp;type="text"&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&lt;input&nbsp;id="name2"&nbsp;type="text"&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category:&lt;input&nbsp;id="category2"&nbsp;type="text"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Price:&lt;input&nbsp;id="price2"&nbsp;type="text"&nbsp;/&gt;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;id="showItem"&nbsp;type="button"&nbsp;value="查询"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;id="editItem"&nbsp;type="button"&nbsp;value="修改"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;id="removeItem"&nbsp;type="button"&nbsp;value="删除"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/section&gt;<br /><br />&lt;/div&gt;<br />&lt;script&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">用于保存用户输入数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;Product&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Id:&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category:&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Price:&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Product;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">添加一条记录&nbsp;请求类型:POST&nbsp;&nbsp;请求url:&nbsp;&nbsp;/api/Products</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">请求到ProductsController.cs中的&nbsp;public&nbsp;HttpResponseMessage&nbsp;PostProduct(Product&nbsp;item)&nbsp;方法</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;$("#addItem").click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;newProduct&nbsp;=&nbsp;Product.create();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newProduct.Name&nbsp;=&nbsp;$("#name").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newProduct.Category&nbsp;=&nbsp;$("#category").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newProduct.Price&nbsp;=&nbsp;$("#price").val();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"/api/Products",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json;&nbsp;charset=utf-8",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;JSON.stringify(newProduct),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("添加成功！");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(XMLHttpRequest,&nbsp;textStatus,&nbsp;errorThrown)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("请求失败，消息："&nbsp;+&nbsp;textStatus&nbsp;+&nbsp;"&nbsp;&nbsp;"&nbsp;+&nbsp;errorThrown);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">先根据Id查询记录&nbsp;&nbsp;请求类型:GET&nbsp;&nbsp;请求url:&nbsp;&nbsp;/api/Products/Id</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">请求到ProductsController.cs中的&nbsp;public&nbsp;Product&nbsp;GetProduct(int&nbsp;id)&nbsp;方法</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;$("#showItem").click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;inputId&nbsp;=&nbsp;$("#id2").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#name2").val("");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#category2").val("");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#price2").val("");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"/api/Products/"&nbsp;+&nbsp;inputId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"GET",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json;&nbsp;charset=urf-8",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#name2").val(data.Name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#category2").val(data.Category);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#price2").val(data.Price);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(XMLHttpRequest,&nbsp;textStatus,&nbsp;errorThrown)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("请求失败，消息："&nbsp;+&nbsp;textStatus&nbsp;+&nbsp;"&nbsp;&nbsp;"&nbsp;+&nbsp;errorThrown);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">修改该Id的记录&nbsp;请求类型:PUT&nbsp;&nbsp;请求url:&nbsp;&nbsp;/api/Products/Id</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">请求到ProductsController.cs中的&nbsp;public&nbsp;void&nbsp;PutProduct(int&nbsp;id,&nbsp;Product&nbsp;product)&nbsp;方法</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;$("#editItem").click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;inputId&nbsp;=&nbsp;$("#id2").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;newProduct&nbsp;=&nbsp;Product.create();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newProduct.Name&nbsp;=&nbsp;$("#name2").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newProduct.Category&nbsp;=&nbsp;$("#category2").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newProduct.Price&nbsp;=&nbsp;$("#price2").val();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"/api/Products/"&nbsp;+&nbsp;inputId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"PUT",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;JSON.stringify(newProduct),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json;&nbsp;charset=urf-8",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("修改成功！&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(XMLHttpRequest,&nbsp;textStatus,&nbsp;errorThrown)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("请求失败，消息："&nbsp;+&nbsp;textStatus&nbsp;+&nbsp;"&nbsp;&nbsp;"&nbsp;+&nbsp;errorThrown);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">删除输入Id的记录&nbsp;&nbsp;请求类型:DELETE&nbsp;&nbsp;请求url:&nbsp;&nbsp;/api/Products/Id</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">请求到ProductsController.cs中的&nbsp;&nbsp;public&nbsp;void&nbsp;DeleteProduct(int&nbsp;id)&nbsp;方法</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;$("#removeItem").click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;inputId&nbsp;=&nbsp;$("#id2").val();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"/api/Products/"&nbsp;+&nbsp;inputId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"DELETE",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json;&nbsp;charset=uft-8",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Id为&nbsp;"&nbsp;+&nbsp;inputId&nbsp;+&nbsp;"&nbsp;的记录删除成功！");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(XMLHttpRequest,&nbsp;textStatus,&nbsp;errorThrown)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("请求失败，消息："&nbsp;+&nbsp;textStatus&nbsp;+&nbsp;"&nbsp;&nbsp;"&nbsp;+&nbsp;errorThrown);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&lt;/script&gt;<br />启动项目，进入home的index页面，这里会对Api接口进行请求操作。</div><img src ="http://www.cnitblog.com/yide/aggbug/92591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-04-24 17:21 <a href="http://www.cnitblog.com/yide/archive/2022/04/24/92591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Net mvc 处理json数据</title><link>http://www.cnitblog.com/yide/archive/2022/03/21/92580.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 21 Mar 2022 06:53:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/03/21/92580.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92580.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/03/21/92580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92580.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92580.html</trackback:ping><description><![CDATA[<br />mvc 处理json数据:<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@{<br />&nbsp;&nbsp;&nbsp;&nbsp;ViewData["Title"]&nbsp;=&nbsp;"Home&nbsp;Page";<br />}<br /><br />&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;id="sumbit"&nbsp;onclick="ajax()"&gt;获取&lt;/button&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;id="xinxi"&gt;&lt;/a&gt;&lt;br&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;姓名：<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="text"&nbsp;id="name"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;spades;<br />&nbsp;&nbsp;&nbsp;&nbsp;密码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="text"&nbsp;id="password"&nbsp;/&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;jieguo：<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="text"&nbsp;id="xinxi22"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id="xinxi"&nbsp;&gt;33333333333&nbsp;&lt;/div&gt;<br />&lt;/div&gt;<br /><br />&lt;script&nbsp;src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"&gt;<br />&lt;/script&gt;<br />&lt;script&nbsp;type="text/javascript"&nbsp;&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;ajax()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;password&nbsp;=&nbsp;document.getElementById("password").value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;name&nbsp;=&nbsp;document.getElementById("name").value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;xixn&nbsp;=&nbsp;JSON.stringify({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;name,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Password:&nbsp;password<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;xhr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;XMLHttpRequest;<span style="color: #008000; ">//</span><span style="color: #008000; ">创建一个&nbsp;XMLHttpRequest&nbsp;对象，XMLHttpRequest是实现ajax的基础</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.open("POST",&nbsp;"/Hello/Login",&nbsp;<span style="color: #0000FF; ">true</span>);<span style="color: #008000; ">//</span><span style="color: #008000; ">请求方式为"Post","/Home/Index"为服务器地址（在MVC这里就是控制器地址+方法名），true表示选择异步</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.setRequestHeader("Content-type",&nbsp;"application/json");<span style="color: #008000; ">//</span><span style="color: #008000; ">设置请求参数类型</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.send(xixn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xhr.onreadystatechange&nbsp;=&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(xhr.readyState&nbsp;==&nbsp;4&nbsp;&amp;&amp;&nbsp;xhr.status&nbsp;==&nbsp;200)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;s&nbsp;=&nbsp;xhr.responseText;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(s);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById("xinxi").innerHTML&nbsp;=&nbsp;JSON.parse(s).result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(xhr.status&nbsp;+&nbsp;":"&nbsp;+&nbsp;xhr.readyState+&nbsp;":"&nbsp;+&nbsp;xhr.responseText);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&lt;/script&gt;</div><br />后台代码：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; [HttpPost]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IActionResult&nbsp;Login([FromBody]&nbsp;Model7&nbsp;model)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(model&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;=&nbsp;model.Name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;password&nbsp;=&nbsp;model.Password;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Json(<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;result&nbsp;=&nbsp;"my:"&nbsp;+&nbsp;Name&nbsp;+&nbsp;"is:"&nbsp;+&nbsp;password&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Json(<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;result&nbsp;=&nbsp;"it&nbsp;Is&nbsp;Null"&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Model7<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Password&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><br /><br /><img src ="http://www.cnitblog.com/yide/aggbug/92580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-03-21 14:53 <a href="http://www.cnitblog.com/yide/archive/2022/03/21/92580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>net webservice ajax访问</title><link>http://www.cnitblog.com/yide/archive/2020/12/17/92382.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Thu, 17 Dec 2020 08:58:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/12/17/92382.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92382.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/12/17/92382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92382.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92382.html</trackback:ping><description><![CDATA[<br /><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; &lt;system.web&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;compilation&nbsp;debug="true"&nbsp;targetFramework="4.0"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;webServices&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;protocols&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name=&nbsp;"HttpPost"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name=&nbsp;"HttpGet"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name="HttpSoap"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name="Documentation"/&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/protocols&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/webServices&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/system.web&gt;<br /><br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;system.webServer&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;httpProtocol&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;customHeaders&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name="Access-Control-Allow-Methods"&nbsp;value="OPTIONS,POST,GET"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name="Access-Control-Allow-Headers"&nbsp;value="x-requested-with"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;name="Access-Control-Allow-Origin"&nbsp;value="*"&nbsp;/&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/customHeaders&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/httpProtocol&gt;<br />&nbsp;&nbsp;&lt;/system.webServer&gt;<br />&nbsp;&nbsp;</div><br /><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;summary&gt;</span><span style="color: #008000; "><br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">WebService&nbsp;的摘要说明http://localhost:65497/<br /></span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;</span><span style="color: #808080; ">&lt;/summary&gt;</span><span style="color: #808080; "><br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">[WebService(Namespace&nbsp;=&nbsp;"</span><span style="color: #008000; text-decoration-line: underline;">http://tempuri.org/</span><span style="color: #008000; ">")]</span><span style="color: #008000; "><br /></span>[WebService(Namespace&nbsp;=&nbsp;"http://localhost:65497/")]<br />[WebServiceBinding(ConformsTo&nbsp;=&nbsp;WsiProfiles.BasicProfile1_1)]<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">若要允许使用&nbsp;ASP.NET&nbsp;AJAX&nbsp;从脚本中调用此&nbsp;Web&nbsp;服务，请取消对下行的注释。&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;[System.Web.Script.Services.ScriptService]<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;WebService&nbsp;:&nbsp;System.Web.Services.WebService&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;WebService&nbsp;()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果使用设计的组件，请取消注释以下行&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">InitializeComponent();&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;[WebMethod]<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;HelloWorld()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Access-Control-Allow-Methods",&nbsp;"OPTIONS,POST,GET");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Access-Control-Allow-Headers",&nbsp;"x-requested-with");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Access-Control-Allow-Origin",&nbsp;"*");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"Hello&nbsp;World";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;[WebMethod]<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;GetAge(<span style="color: #0000FF; ">string</span>&nbsp;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Access-Control-Allow-Methods",&nbsp;"OPTIONS,POST,GET");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Access-Control-Allow-Headers",&nbsp;"x-requested-with");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Access-Control-Allow-Origin",&nbsp;"*");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.AppendHeader("Content-type",&nbsp;"application/json");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"ID为:"&nbsp;+&nbsp;id&nbsp;+&nbsp;"的年龄为:"&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Random().Next(10,&nbsp;41);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&gt;<br />&lt;head&nbsp;runat="server"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=utf-8"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&nbsp;src="&nbsp;http://libs.baidu.com/jquer77777y/1.11.1/jquery.min.js&nbsp;"&gt;&lt;/script&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&nbsp;src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"&gt;&lt;/script&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#getdata").click(<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;'Post',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;'http://localhost:65497/WebSite1/WebService.asmx/GetAge?id=3344',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;data:&nbsp;'{id:"bbut101"}',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;data:&nbsp;'id=bbut101',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;dataType:&nbsp;'json',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;'xml',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;function&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#data").append(data.d);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;alert("3333333333");</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;htmlobj&nbsp;=&nbsp;$.ajax({&nbsp;url:&nbsp;"http://localhost:65497/WebSite1/WebService.asmx/GetAge",&nbsp;async:&nbsp;false&nbsp;});</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;$("#data").html(htmlobj.responseText);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;$.post("http://localhost:65497/WebSite1/WebService.asmx/GetAge",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;id:&nbsp;"Duckburg"&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;(data,&nbsp;status)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("数据："&nbsp;+&nbsp;data&nbsp;+&nbsp;"\n状态："&nbsp;+&nbsp;status);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"GET",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"UTF-8",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"http://localhost:65497/WebSite1/WebService.asmx/GetAge?id=3322",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;'jsonp',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;dataType:&nbsp;'text',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;function&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"POST",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType:&nbsp;"application/json;charset=utf-8",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"http://localhost:65497/WebSite1/WebService.asmx/GetAge?id=44333",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;"{id:12345&nbsp;}",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;'jsonp',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;function&nbsp;(response)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("成功："&nbsp;+&nbsp;response.d);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;function&nbsp;(msg)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("错误："&nbsp;+&nbsp;msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;jQuery.support.cors&nbsp;=&nbsp;true;&nbsp;//IE10以下</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$.ajax({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;"post",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;"http://localhost:65497/WebSite1/WebService.asmx/GetAge?id=44333",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;dataType:&nbsp;'xml',</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataType:&nbsp;'text',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;{&nbsp;id:&nbsp;'eve7777'&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(data);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">xml对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;document.write(data);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;$("#data").append(data);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(XMLHttpRequest,&nbsp;textStatus,&nbsp;errorThrown)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;console.log(XMLHttpRequest);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('error:'&nbsp;+&nbsp;errorThrown);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;$("#data").append(errorThrown);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;id="getdata"&nbsp;href="javascript:void(0);"&gt;获取dddd数据&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id="data"&gt;&lt;/div&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div><br /><br /><br /><img src ="http://www.cnitblog.com/yide/aggbug/92382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-12-17 16:58 <a href="http://www.cnitblog.com/yide/archive/2020/12/17/92382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>session过期设置</title><link>http://www.cnitblog.com/yide/archive/2020/10/22/92350.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Thu, 22 Oct 2020 09:00:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/10/22/92350.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92350.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/10/22/92350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92350.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92350.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->保持Session的方法：有人说设session.timeout=-1，或小于0的数。这种方法肯定是不行的，session计算时间以分钟为单位，必须是大于等于1的整数。又有人说设session.timeout=99999。这种同样不行，session有最大时间限制。我经过测试发现最大值为24小时，也就是说你最大可以session.timeout=1440，1441都是不可以有，呵呵。本人测试环境：win2003+IIS6.0+ASP3.0。&nbsp;<br /><br />所以想通过设session.timeout的过期时间让session永不过期是不可能的。写到Cookies里是比较好的方法，网上也有很多这样的教程，这里就不再说了！还有就是用在要保持session的页里设隐藏iframe每隔一段时间（这个时间小于session.timeout的时间）把刷新一次frame里的空页面！实现方法如下：&nbsp;<br /><br />在要保持session页里加上：&nbsp;&lt;iframe&nbsp;width=0&nbsp;height=0&nbsp;src="/blog/SessionKeeper.asp"&gt;&nbsp;<br />&lt;/iframe&gt;&nbsp;<br /><br /><br />同目录下建一下SessionKeeper.asp的文件。&nbsp;&lt;html&gt;&nbsp;<br />&lt;head&gt;&nbsp;<br />&lt;meta&nbsp;http-equiv="Refresh"&nbsp;content="900000;url=sessionKeeper.asp"&gt;&nbsp;<br />&lt;!--每隔900秒刷新一下自己，为了和服务器通讯一下，保持session不会丢--&gt;&nbsp;<br />&lt;/head&gt;&nbsp;<br />&lt;/html&gt;&nbsp;<br /><br /><br />这种方法还是比较长见的，另外还有一种和上面类似的方法，不过他不是用meta自动刷新嵌套的iframe的方法。他是用javascript:window.setTimeout("functionname()",10000);第隔一段时间时间自动调用一个函数的方法，当然函数里还是要去连接一个空的文件。具体方法如下：&nbsp;<br /><br />在要保持session面里加上：&nbsp;&lt;script&nbsp;id=Back&nbsp;language=javascript&gt;&lt;/script&gt;&nbsp;<br /><br />&lt;script&nbsp;language=javascript&gt;&nbsp;<br />function&nbsp;keepsession(){&nbsp;<br />document.all["Back"].src="/blog/SessionKeeper.asp?RandStr="+Math.random();&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">这里的RandStr=Math.random只是为了让每次back.src的值不同，防止同一地址刷新无效的情况&nbsp;</span><span style="color: #008000; "><br /></span>window.setTimeout("keepsession()",900000);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">每隔900秒调用一下本身&nbsp;</span><span style="color: #008000; "><br /></span>}&nbsp;<br />keepsession();&nbsp;<br />&lt;/script&gt;&nbsp;<br /><br />这样同一目录下建一个空内容的sessionKeeper.asp就文件就可以了！&nbsp;</div><img src ="http://www.cnitblog.com/yide/aggbug/92350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-10-22 17:00 <a href="http://www.cnitblog.com/yide/archive/2020/10/22/92350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Layui table 示例</title><link>http://www.cnitblog.com/yide/archive/2020/08/05/92305.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Wed, 05 Aug 2020 02:35:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/08/05/92305.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92305.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/08/05/92305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92305.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92305.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />Layui&nbsp;table&nbsp;示例<br /><br />&nbsp;&lt;link&nbsp;rel="stylesheet"&nbsp;href="lib/layui/css/layui.css"&nbsp;media="all"&gt;<br /><br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;table&nbsp;id="demo"&nbsp;lay-filter="test"&gt;&lt;/table&gt;<br />&nbsp;<br />&lt;script&nbsp;src="lib/layui/layui.js"&gt;&lt;/script&gt;<br />&lt;script&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;layui.use('table',&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;table&nbsp;=&nbsp;layui.table;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">第一个实例</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.render({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elem:&nbsp;'#demo'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;height:&nbsp;312<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;,&nbsp;url:&nbsp;'/demo/table/user/'&nbsp;//数据接口</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;&nbsp;url:&nbsp;'common/Getdatatwo.ashx'&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;page:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">开启分页</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;edit:&nbsp;<span style="color: #0000FF; ">true</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;cols:&nbsp;[[&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">表头</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;checkbox:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;{&nbsp;checkbox:&nbsp;true,type:&nbsp;'checkbox',&nbsp;width:&nbsp;100,&nbsp;title:&nbsp;'选择'&nbsp;},</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;{&nbsp;type:&nbsp;'checkbox',&nbsp;width:&nbsp;100,&nbsp;title:&nbsp;'选择'&nbsp;},</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;{&nbsp;field:&nbsp;'ID',&nbsp;title:&nbsp;'ID',&nbsp;width:&nbsp;80,&nbsp;sort:&nbsp;true,&nbsp;fixed:&nbsp;'left'&nbsp;}</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;{&nbsp;&nbsp;field:&nbsp;'yuefen',&nbsp;&nbsp;&nbsp;title:'月份',&nbsp;width:&nbsp;80&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;{&nbsp;field:&nbsp;"state",&nbsp;title:&nbsp;"状态",&nbsp;width:&nbsp;80,&nbsp;sort:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;{&nbsp;field:&nbsp;"state2",&nbsp;title:&nbsp;"状态2",&nbsp;width:&nbsp;80,&nbsp;event:&nbsp;'setSign',&nbsp;style:&nbsp;'cursor:&nbsp;pointer;'&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;{&nbsp;&nbsp;field:&nbsp;"empname",&nbsp;&nbsp;&nbsp;title:&nbsp;"操作员"&nbsp;,&nbsp;width:&nbsp;177&nbsp;,edit:<span style="color: #0000FF; ">true</span>&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;{&nbsp;field:&nbsp;"createdate",&nbsp;title:&nbsp;"时间",&nbsp;width:&nbsp;180,&nbsp;sort:&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;{&nbsp;fixed:&nbsp;'right',&nbsp;width:&nbsp;250,&nbsp;align:&nbsp;'center',&nbsp;toolbar:&nbsp;'#barDemo'&nbsp;}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这里的toolbar值是模板元素的选择器</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">*********************************</span><span style="color: #008000; "><br /></span>&nbsp;,&nbsp;page:&nbsp;{&nbsp;theme:&nbsp;'#409eff',&nbsp;prev:&nbsp;'上一页',&nbsp;groups:&nbsp;8,&nbsp;next:&nbsp;'下一页',&nbsp;layout:&nbsp;['count',&nbsp;'prev',&nbsp;'page',&nbsp;'next']&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">********************************</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">*******************************</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">监听行单击事件</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.on('row(test)',&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;console.log(obj.tr)&nbsp;//得到当前行元素对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;console.log(obj.data)&nbsp;//得到当前行数据</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;alert(obj.data.yuefen);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">obj.del();&nbsp;//删除当前行</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">obj.update(fields)&nbsp;//修改当前行数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">监听行双击事件</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.on('rowDouble(test)',&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">obj&nbsp;同上</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">监听复选框选择</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.on('checkbox(test)',&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(obj.checked);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(obj.data.ID);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(obj.checked);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">当前是否选中状态</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;console.log(obj.data);&nbsp;//选中行的相关数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(obj.type);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果触发的是全选，则为：all，如果触发的是单选，则为：one</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">编辑</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.on('edit(test)',&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(obj)&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">注：edit是固定事件名，test是table原始容器的属性&nbsp;lay-filter="对应的值"</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("1122"&nbsp;+&nbsp;obj.value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(obj.value);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">得到修改后的值</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(obj.field);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">当前编辑的字段名</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(obj.data);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">所在行的所有相关数据&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">监听单元格事件</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.on('tool(test)',&nbsp;<span style="color: #0000FF; ">function</span>&nbsp;(obj)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">var</span>&nbsp;data&nbsp;=&nbsp;obj.data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(obj.event&nbsp;===&nbsp;'setSign')&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("eeeeeee："&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">同步更新表格和缓存对应的值</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.update({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state2:&nbsp;'7777777'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.prompt({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formType:&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;title:&nbsp;'修改&nbsp;ID&nbsp;为&nbsp;['&nbsp;+&nbsp;data.id&nbsp;+&nbsp;']&nbsp;的用户签名'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;value:&nbsp;data.sign<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;function&nbsp;(value,&nbsp;index)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.close(index);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里一般是发送修改的Ajax请求<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//同步更新表格和缓存对应的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.update({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sign:&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">监听工具条&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.on('tool(test)',&nbsp;function&nbsp;(obj)&nbsp;{&nbsp;//注：tool&nbsp;是工具条事件名，test&nbsp;是&nbsp;table&nbsp;原始容器的属性&nbsp;lay-filter="对应的值"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data&nbsp;=&nbsp;obj.data;&nbsp;//获得当前行数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;layEvent&nbsp;=&nbsp;obj.event;&nbsp;//获得&nbsp;lay-event&nbsp;对应的值（也可以是表头的&nbsp;event&nbsp;参数对应的值）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;tr&nbsp;=&nbsp;obj.tr;&nbsp;//获得当前行&nbsp;tr&nbsp;的&nbsp;DOM&nbsp;对象（如果有的话）<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(layEvent&nbsp;===&nbsp;'detail')&nbsp;{&nbsp;//查看<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;somehing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(layEvent&nbsp;===&nbsp;'del')&nbsp;{&nbsp;//删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.confirm('真的删除行么',&nbsp;function&nbsp;(index)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.del();&nbsp;//删除对应行（tr）的DOM结构，并更新缓存<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.close(index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//向服务端发送删除指令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(layEvent&nbsp;===&nbsp;'edit')&nbsp;{&nbsp;//编辑<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;something<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//同步更新缓存对应的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.update({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state2:&nbsp;'123'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;empname:&nbsp;'xxx'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(layEvent&nbsp;===&nbsp;'LAYTABLE_TIPS')&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer.alert('Hi，头部工具栏扩展的右侧图标。');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&lt;/script&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type="text/html"&nbsp;id="barDemo"&gt;<br />&nbsp;&nbsp;&lt;a&nbsp;class="layui-btn&nbsp;layui-btn-xs"&nbsp;lay-event="detail"&gt;查看&lt;/a&gt;<br />&nbsp;&nbsp;&lt;a&nbsp;class="layui-btn&nbsp;layui-btn-xs"&nbsp;lay-event="edit"&gt;编辑&lt;/a&gt;<br />&nbsp;&nbsp;&lt;a&nbsp;class="layui-btn&nbsp;layui-btn-danger&nbsp;layui-btn-xs"&nbsp;lay-event="del"&gt;删除&lt;/a&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;!--&nbsp;这里同样支持&nbsp;laytpl&nbsp;语法，如：&nbsp;--&gt;<br />&nbsp;&nbsp;{{#&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(d.auth&nbsp;&gt;&nbsp;2){&nbsp;}}<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;class="layui-btn&nbsp;layui-btn-xs"&nbsp;lay-event="check"&gt;审核&lt;/a&gt;<br />&nbsp;&nbsp;{{#&nbsp;&nbsp;}&nbsp;}}<br />&lt;/script&gt;<br /><br /></div><img src ="http://www.cnitblog.com/yide/aggbug/92305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-08-05 10:35 <a href="http://www.cnitblog.com/yide/archive/2020/08/05/92305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lambda表达式</title><link>http://www.cnitblog.com/yide/archive/2020/07/28/92301.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Tue, 28 Jul 2020 00:25:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/28/92301.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92301.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/28/92301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92301.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92301.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />一、简介　　<br />　　Lambda表达式来源于数学家Alonzo&nbsp;Church等人在1920~1930期间发明的Lambad积分。Lambda积分是用于表示函数的一套系统，它使用希腊字母Lambda（&nbsp;&#955;&nbsp;）来表示无名函数。<br /><br />　　C#&nbsp;3.0引入了Lambda表达式，它是一种简化的匿名函数，可用于创建委托或表达式目录树。你也可以将&nbsp;Lambda&nbsp;表达式作为参数进行传递，或者将它作用于函数调用值调用后返回的一个函数来使用。<br /><br />&nbsp;<br /><br />二、基础<br />　　它的语法形式是：&nbsp;输入参数&nbsp;=&gt;&nbsp;表达式或语句块　　即运算符的左边是输入参数(如果有)，右边是表达式或语句块。&nbsp;（&nbsp;&#8220;&nbsp;=&gt;&nbsp;&#8221;&nbsp;读作&nbsp;&#8220;&nbsp;goes&nbsp;to&nbsp;&#8221;&nbsp;）<br /><br />　　<br /><br />　　2.1&nbsp;表达式Lambda<br />　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表达式位于&nbsp;=&gt;&nbsp;运算符右侧的&nbsp;lambda&nbsp;表达式称为&#8220;表达式&nbsp;lambda&#8221;。&nbsp;表达式&nbsp;Lambda&nbsp;会返回表达式的结果，并采用以下基本形式：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;(input&nbsp;parameters)&nbsp;=&gt;&nbsp;expression<br /><br /><span style="color: #0000FF; ">delegate</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;myDel(<span style="color: #0000FF; ">int</span>&nbsp;x,<span style="color: #0000FF; ">int</span>&nbsp;y);&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">声明委托</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">class</span>&nbsp;Program<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main(<span style="color: #0000FF; ">string</span>[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myDel&nbsp;del&nbsp;=&nbsp;(x,y)&nbsp;=&gt;&nbsp;&nbsp;x+y;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">返回x+y的结果</span><span style="color: #008000; "><br /></span>　　　　　　　Console.WriteLine("values&nbsp;{0}",del(5,8));&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">输出13&nbsp;&nbsp;　　　　　&nbsp;Console.ReadKey();&nbsp;　　　　　}&nbsp;　　}</span><span style="color: #008000; "><br /></span><br /><br />有关Lambda表达式的参数列表要点如下：<br /><br />&#9829;　Lambda表达式参数列表中的参数必须在参数数量、类型和位置上与委托相匹配<br /><br />&#9829;&nbsp;&nbsp;&nbsp;&nbsp;表达式参数列表中的参数不一定需要包含类型（隐式类型），除非委托有ref或out参数----此时必须注明类型（显式类型）<br /><br />&#9829;&nbsp;&nbsp;&nbsp;&nbsp;如果只有一个参数，并且是隐式类型的，周围的圆括号可以被省略，否则必须有括号<br /><br />&#9829;&nbsp;&nbsp;&nbsp;&nbsp;如果没有参数，必须使用一组空的圆括号<br /><br />2.2&nbsp;&nbsp;语句Lambda<br />　　　　当lambda表达式中，有多个语句时，写成如下形式：<br /><br />　　　　(input&nbsp;parameters)&nbsp;=&gt;&nbsp;{&nbsp;&nbsp;statement；&nbsp;}<br /><br /><span style="color: #0000FF; ">delegate</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;myDel(<span style="color: #0000FF; ">string</span>&nbsp;str);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Program<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main(<span style="color: #0000FF; ">string</span>[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myDel&nbsp;del&nbsp;=&nbsp;(str)&nbsp;=&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("hello&nbsp;{0}",str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("values&nbsp;{0}",del("world"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">&nbsp; &nbsp; 在C#的语法中有一种比较特殊的写法，叫做Lambda表达式，这种表达式的写法在于你查询数据的时候直接是使用以下箭头的形式来表示查询语句的：=&gt;。例如，我们要查找学生的List&lt;Student&gt;集合中班级编号为1001的所有学生数据，我们即可用Studentlist.Where(t=&gt;t.ClassCode=&#8216;1001&#8217;)语句来直接完成，无需再写繁琐的foreach语句或者for循环。Lambda表达式的运算符即为=&gt;。</p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><strong style="margin: 0px; padding: 0px;">一、Lambda表达式定义</strong></p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">&nbsp; &nbsp; &nbsp; &nbsp; Lambda表达式实际上是一种匿名函数，在Lambda表达式中可以包含语句以及运算等操作。并且可用于创建委托或表达式目录树类型，支持带有可绑定到委托或表达式树的输入参数的内联表达式。使用Lambda表达式可大大减少代码量，使得代码更加的优美、简洁，更有可观性。</p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">&nbsp;</p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><strong style="margin: 0px; padding: 0px;">二、Lambda表达式的表现形式</strong></p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><strong style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;</strong>表达式形式：(Input Param)=&gt;Expression。在表达式左侧的表示输入参数，右侧的为相应的运算语句或者判断语句等，可包含函数调用等复杂方式。运算符=&gt;读作为goes to，例如下面这个表达t=&gt;t.ClassCode='1001'，多做goes to ClassCode equal 1001。</p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">&nbsp; &nbsp; &nbsp; &nbsp;在上述的表达式中，仅仅只有当参数只有一个的时候，括号是可选择的，例如下面这种含有两个参数时候的情况应该是这样子的写法</p><div sh-gutter"="" style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><div style="margin: 0px; padding: 0px;"><div id="highlighter_844068"  csharp"="" style="padding: 0px; width: 849px; margin: 1em 0px !important; position: relative !important; overflow: auto !important; font-size: 1em !important;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: #dfdfdf; width: 849px; word-break: break-word; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; font-size: 12px !important; min-height: auto !important;"><tbody style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><tr style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 35px !important; box-sizing: content-box !important; min-height: auto !important; color: #afafaf !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 0.5em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;">1</div></td><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background-image: none !important; background-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 1em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;"><code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">(a,b)=&gt;a==b</code></div></div></td></tr></tbody></table></div></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">　　当表达式中的多个参数编译器无法自动判断类型的时候，则需要显式指定类型。</p><div sh-gutter"="" style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><div style="margin: 0px; padding: 0px;"><div id="highlighter_385153"  csharp"="" style="padding: 0px; width: 849px; margin: 1em 0px !important; position: relative !important; overflow: auto !important; font-size: 1em !important;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: #dfdfdf; width: 849px; word-break: break-word; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; font-size: 12px !important; min-height: auto !important;"><tbody style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><tr style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 35px !important; box-sizing: content-box !important; min-height: auto !important; color: #afafaf !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 0.5em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;">1</div></td><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background-image: none !important; background-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 1em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;"><code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">(</code><code keyword"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">int</code>&nbsp;<code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">firstIndex,&nbsp;</code><code keyword"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">string</code>&nbsp;<code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">str) =&gt; str.IndexOf(</code><code string"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">'Hello'</code><code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">) &gt; firstIndex</code></div></div></td></tr></tbody></table></div></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">&nbsp;(1)查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储</p><div style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><div sh-gutter"="" style="margin: 0px; padding: 0px;"><div style="margin: 0px; padding: 0px;"><div id="highlighter_721921"  csharp"="" style="padding: 0px; width: 849px; margin: 1em 0px !important; position: relative !important; overflow: auto !important; font-size: 1em !important;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: #dfdfdf; width: 849px; word-break: break-word; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; font-size: 12px !important; min-height: auto !important;"><tbody style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><tr style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 35px !important; box-sizing: content-box !important; min-height: auto !important; color: #afafaf !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 0.5em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;">1</div></td><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background-image: none !important; background-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 1em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;"><code keyword"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">var</code>&nbsp;<code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">list1001=Studentlist.Where(t=&gt;t.ClassCode==&#8216;1001&#8217;)；</code></div></div></td></tr></tbody></table></div></div></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">　(2)查询班级编号为1001的班级下面的所有学生实体并返回到list1001中存储，并按照学生的出生日期从小到大排列。</p><div style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><div sh-gutter"="" style="margin: 0px; padding: 0px;"><div style="margin: 0px; padding: 0px;"><div id="highlighter_421652"  csharp"="" style="padding: 0px; width: 849px; margin: 1em 0px !important; position: relative !important; overflow: auto !important; font-size: 1em !important;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: #dfdfdf; width: 849px; word-break: break-word; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; font-size: 12px !important; min-height: auto !important;"><tbody style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><tr style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 35px !important; box-sizing: content-box !important; min-height: auto !important; color: #afafaf !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 0.5em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;">1</div></td><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background-image: none !important; background-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 1em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;"><code keyword"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">var</code>&nbsp;<code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">list1001=Studentlist.Where(t=&gt;t.ClassCode==&#8216;1001&#8217;).OrderBy(t=&gt;t.BirthDay)；</code></div></div></td></tr></tbody></table></div></div></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">&nbsp; &nbsp;在此说一下，OrderBy是从小到大排序，需要从大到小排列则用OrderByDescending。</p><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;">　(3)查询班级编号为1001的班级下面的姓氏为【李】的同学的所有集合，并按照学生的出生日期从小到大排列。</p><div sh-gutter"="" style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px;"><div style="margin: 0px; padding: 0px;"><div id="highlighter_853623"  csharp"="" style="padding: 0px; width: 849px; margin: 1em 0px !important; position: relative !important; overflow: auto !important; font-size: 1em !important;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: #dfdfdf; width: 849px; word-break: break-word; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; font-size: 12px !important; min-height: auto !important;"><tbody style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><tr style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: 35px !important; box-sizing: content-box !important; min-height: auto !important; color: #afafaf !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 0.5em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; text-align: right !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;">1</div></td><td style="padding: 8px 14px; border-style: solid; border-color: #c0c0c0; border-collapse: collapse; min-width: 50px; margin: 0px !important; border-radius: 0px !important; background: none !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background-image: none !important; background-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline: 0px !important; overflow: visible !important; position: relative !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;"><div number1="" index0=""  alt2"="" style="margin: 0px !important; padding: 0px 1em !important; border-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important; white-space: nowrap !important;"><code keyword"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important; color: #0000ff !important;">var</code>&nbsp;<code plain"="" style="margin: 0px !important; padding: 0px !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, Courier, monospace !important; min-height: auto !important;">list1001=Studentlist.Where(t=&gt;t.ClassCode==&#8216;1001&#8217;&amp;&amp;t.StudentName.StartWith（&#8220;李&#8221;）).OrderBy(t=&gt;t.BirthDay)；</code></div></div></td></tr></tbody></table></div></div></div><img src ="http://www.cnitblog.com/yide/aggbug/92301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-28 08:25 <a href="http://www.cnitblog.com/yide/archive/2020/07/28/92301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# Mvc常用特性2</title><link>http://www.cnitblog.com/yide/archive/2020/07/27/92299.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 27 Jul 2020 05:49:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/27/92299.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92299.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/27/92299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92299.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92299.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />1.[Required]&nbsp;:&nbsp;必须输入<br /><br />[Required(ErrorMessage&nbsp;=&nbsp;"请输入用户名")]&nbsp;&nbsp;<br />&nbsp;<br /><br />2.[StringLength]&nbsp;:&nbsp;限制字符串长度<br /><br />[StringLength(10,&nbsp;ErrorMessage&nbsp;=&nbsp;"长度不能超过10个字符")]&nbsp;&nbsp;<br /><br />3.[Range]&nbsp;:&nbsp;限制取值范围<br /><br />[Range(0,&nbsp;120,&nbsp;ErrorMessage&nbsp;=&nbsp;"年龄范围在0到120岁之间")]&nbsp;&nbsp;<br />&nbsp;<br /><br />4.[RegularExpression]&nbsp;:&nbsp;必须符合某个正则表达式(1)直接使用RegularExpression来写表达式:<br /><br />01.[RegularExpression(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$",&nbsp;ErrorMessage&nbsp;=&nbsp;"请输入Email格式")]&nbsp;&nbsp;<br />02.<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;RegualarExpressionField&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}&nbsp;<br /></div><img src ="http://www.cnitblog.com/yide/aggbug/92299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-27 13:49 <a href="http://www.cnitblog.com/yide/archive/2020/07/27/92299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# Mvc常用特性</title><link>http://www.cnitblog.com/yide/archive/2020/07/27/92298.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 27 Jul 2020 05:38:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/27/92298.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92298.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/27/92298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92298.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92298.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />&nbsp;介绍一些在开发中非常有用的MVC特性，如下：<br /><br />BindAttribute<br />Remote<br />HandleError<br />HiddenInput<br /><br />1.BindAttribute<br />使用BindAttribute的目的是限制用户在提交form表单时使用合适且正确的值。当我们提交一个表单时，就会检查每一个实体上绑定的特性。<br /><br />假设我们已经有下面一个Employee实体类：<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Employee<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Email&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Address&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;PhoneNo&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />}<br /><br />现在如果我们只想提交Email，Name和PhoneNo，而我们不想提交地址，这时我们可以在实体类上添加如下特性：<br />[Bind(Exclude="Address")]<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Employee<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Email&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Address&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;PhoneNo&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br /><br />BindAttribute要在System.Web.Mvc命名空间下使用，使用BindAttribute，我们可以在提交表单时对字段进行一些控制。在下面的图中，我们已经在提交的form数据中得不到Address的值了。<br /><br />我们也可以将BindAttribute直接用在Action的参数中，像下面这样：<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;Actionresult&nbsp;emprigister([Bind(Exclude="Address")],Emploree&nbsp;emp)<br />{<br />}<br /><br />2.RemoteAttribute<br />假设我们有一个注册表单，里面有邮箱文本框，当输入邮箱后，我们想检查输入的邮箱是否在数据库中已经存在，如果存在，则不提交表单，这时我们可以使用RemoteAttribute，通过RemoteAttribute，我们可以在不用提交表单就可以先进行一些服务端验证。<br /><br />我们可以在下面的例子中使用RemoteAttribute：<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Employee<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;[Remote("CheckEmail","Employee",ErrorMessage="Email&nbsp;is&nbsp;already&nbsp;exist")]<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Email&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Address&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;PhoneNo&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />}<br /><br />RemoteAttribute的第一个参数是一个Action名字，第二个是Controller名字，第三个是如果邮箱已存在后显示给用户看的提示信息。当我们输入完邮箱后，CheckEmail方法将被执行并检查邮箱是否存在。<br /><span style="color: #0000FF; ">public</span>&nbsp;JsonResult&nbsp;CheckEmail(<span style="color: #0000FF; ">string</span>&nbsp;Email)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Check&nbsp;here&nbsp;in&nbsp;database&nbsp;if&nbsp;it&nbsp;exist&nbsp;in&nbsp;database&nbsp;return&nbsp;true&nbsp;else&nbsp;false.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Json(<span style="color: #0000FF; ">false</span>,&nbsp;JsonRequestBehavior.AllowGet);<br />&nbsp;&nbsp;}<br /><br /><br />3.HandleError&nbsp;Attribute<br />我们已经有很多方法在MVC中处理异常，比如用try&nbsp;<span style="color: #0000FF; ">catch</span>，或者使用Filter，或者通过第三方库比如elmah。但是MVC也提供了一个HandleErrorAttribute去处理异常，如下：<br /><br />[HandleError()]<br /><span style="color: #0000FF; ">public</span>&nbsp;ActionResult&nbsp;CheckError()<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;a&nbsp;/&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;View();<br />&nbsp;&nbsp;}<br /><br />在web.config文件中，我们添加如下两行：<br /><br />&lt;customErrors&nbsp;mode&nbsp;="On"&nbsp;defaultRedirect&nbsp;="Error.cshtml"&gt;<br />&lt;/customErrors&gt;<br /><br />在shared文件夹下创建一个视图Error.cshtml，然后运行程序，如果运行上面的CheckError()方法，你刚创建的Error.cshtml将会显示出来。<br /><br />我们也可以使用HandleErrorAttribute给不同类型的异常显示不同的视图页面。<br /><br />[HandleError(ExceptionType=<span style="color: #0000FF; ">typeof</span>(DivideByZeroException),View="DivideByZeroErrorView")]<br />[HandleError(ExceptionType&nbsp;=&nbsp;<span style="color: #0000FF; ">typeof</span>(NullReferenceException),&nbsp;View&nbsp;=&nbsp;"NullRefrenceErrorView")]<br /><span style="color: #0000FF; ">public</span>&nbsp;ActionResult&nbsp;CheckError()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;k&nbsp;=&nbsp;a&nbsp;/&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;View();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />4.HiddenInput&nbsp;Attribute<br />如果我们想对用户隐藏一些实体字段，我们可以使用HiddenInput特性。<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Employee<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[HiddenInput(DisplayValue=<span style="color: #0000FF; ">false</span>)]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Remote("CheckEmail","Employee",ErrorMessage="Email&nbsp;is&nbsp;already&nbsp;exist")]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Email&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Address&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;PhoneNo&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />在以上的实体中，我用HiddenInput特性去描述Name字段。这样程序运行后在浏览器中Name字段将不在显示。因此HiddenInput给我们d&nbsp;在实体字段上多了一些额外的控制。</div><img src ="http://www.cnitblog.com/yide/aggbug/92298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-27 13:38 <a href="http://www.cnitblog.com/yide/archive/2020/07/27/92298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 抽象类和接口</title><link>http://www.cnitblog.com/yide/archive/2020/07/24/92293.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 24 Jul 2020 00:51:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/24/92293.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92293.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/24/92293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92293.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92293.html</trackback:ping><description><![CDATA[<blockquote style="background: none #eeeeee; border-width: 0px 0px 0px 18px; border-top-style: initial; border-right-style: initial; border-bottom-style: initial; border-left-style: solid; border-top-color: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: #cccccc; border-image: initial; padding: 4px; margin: 0px; width: 797.594px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;"><pre class="reply-text mb10" style="margin-top: 0px; margin-bottom: 0px; color: #494949; background-color: #c7cbbd;">抽象类与接口紧密相关。然接口又比抽象类更抽象，这主要体现在它们的差别上：1）类可以实现无限个接口，但仅能从一个抽象（或任何其他类型）类继承，从抽象类派生的类仍可实现接口，从而得出接口是用来解决多重继承问题的。2）抽象类当中可以存在非抽象的方法，可接口不能且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。3）抽象类中的成员变量可以被不同的修饰符来修饰，可接口中的成员变量默认的都是静态常量（static final）。4）这一点也是最重要的一点本质的一点"抽象类是对象的抽象，然接口是一种行为规范"。
  以上是它们本身的异同，下面再来从实际应用讲讲它们的异同！
  不同之处:
  1、定义 
  抽象类表示该类中可能已经有一些方法的具体定义，但是接口就仅仅只能定义各个方法的界面(方法名，参数列表，返回类型)，并不关心具体细节。
  1、用法 
  1）在继承抽象类时，必须覆盖该类中的每一个抽象方法，而每个已实现的方法必须和抽象类中指定的方法一样，接收相同数目和类型的参数，具有同样的返回值，这一点与接口相同。
  2）当父类已有实际功能的方法时，该方法在子类中可以不必实现，直接引用的方法，子类也可以重写该父类的方法（继承的概念）。
  3）而实现 (implement)一个接口（interface)的时候，是一定要实现接口中所定义的所有方法，而不可遗漏任何一个。
  4）另外，抽象类不能产生对象的，但可以由它的实现类来声明对象。
  有鉴于此，在实现接口时，我们也常写一个抽象类，来实现接口中的某些子类所需的通用方法 </pre><p style="margin: 10px auto;"><br /><br />对于C#初学者来说，abstract抽象类在网上的定义和解释说了一大堆，却往往我们忽视了为何要使用abstract类，使用它的意义在哪里。面试的时候也会有人问起使用它有什么好处，因为不适用它用自己定义的类也可以实现。那么为什么要使用抽象类？</p></blockquote><blockquote style="background: none #eeeeee; border-width: 0px 0px 0px 18px; border-top-style: initial; border-right-style: initial; border-bottom-style: initial; border-left-style: solid; border-top-color: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: #cccccc; border-image: initial; padding: 4px; margin: 0px; width: 797.594px; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px;"><p style="margin: 10px auto;"><strong>那么我们什么时候应该用抽象类呢？</strong><br />如果一个类设计的目点是用来<span style="color: #ff0000;">被其它类继承</span>的，它<span style="color: #ff0000;">代表一类对象的所具有的公共属性或方法</span>，那个这个类就应该设置为抽象类。<br /><br /><strong>抽象类与其它的类有什么区别呢？</strong><br />抽象类是<span style="color: #ff0000;">不能够被实例化</span>的。如果<span style="color: #ff0000;">一个类中包含有抽象方法，那么这个类一定要声明为抽象类</span>。同时，抽象方法一定需要在子类中重写，让抽象方法成为一个具体的实实在在的方法。</p><p style="margin: 10px auto;">相信大家在网上一定看过很多这类解释了吧？好吧，不理解的我们一起来<span style="color: #ff0000;">看看通俗易理解的说法吧：</span></p><p style="margin: 10px auto;">比如说：我们需要创建 &#8220;狗&#8221;、&#8220;猫&#8221;、&#8220;鱼&#8221;、&#8220;马&#8221;这些对象（类），我们可以说他们有一些共同的属性像嘴巴、尾巴、重量、颜色、大小等等一些共同的属性（properties）,但是它们彼此的属性的形状是不同的（如嘴巴），在这种情况下，我们如果一个个去定义各自类似的属性是不是比较繁琐？如果用抽象类是不是很方便的给他们去继承。抽象类也有个更加好的地方，体现在&#8220;同质异像&#8221;就是实质相同实现形式不同的方法继承上，例如上面的狗、猫、马等的呼吸这个方法或者跑的速度的方法形式不同，我们这个是用定义一个抽象方法，让他们各自的类去实现它是不是很方便。&#8220;抽象&#8221;的意义正在于此。将共同的东西抽出来封装，但不实现只给继承。</p></blockquote><img src ="http://www.cnitblog.com/yide/aggbug/92293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-24 08:51 <a href="http://www.cnitblog.com/yide/archive/2020/07/24/92293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 使用接口</title><link>http://www.cnitblog.com/yide/archive/2020/07/24/92292.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 24 Jul 2020 00:49:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/24/92292.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92292.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/24/92292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92292.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92292.html</trackback:ping><description><![CDATA[<span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">c#为什么要使用接口?通俗的讲，就是为了降低耦合度。给大家看一个我见过的很搞笑的例子。看看下面的程序：一个学校里边，有两种人：学生、老师。他们都要吃饭和睡觉。</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">public interface I人</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">{</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; void 吃饭();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; void 睡觉();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">}</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">public class 学生:I人</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">{</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 吃饭()</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ //去食堂吃饭 }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 睡觉()</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ //回寝室睡觉 }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; //其他特有方法，比如泡妞、打游戏</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">}</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">public class 老师:I人</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">{</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 吃饭()</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ //回家吃饭 }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 睡觉()</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ //回家睡觉 }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; //其它特有方法，比如为生儿育女传宗接代的历史使命努力等&#8220;不足为外人道也&#8221;的事情</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">}</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">public class 学校</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">{</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 开饭(I人 ren)</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ ren.吃饭(); }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 放学(I人 ren)</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ ren.睡觉(); }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">}</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; 这里就用到了里氏代换原则，"开饭()"和"放学()"的参数都是人，那么这个地方如果换成学生和老师肯定也可以。</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">I人 某学生 = new 学生();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">某学生.开饭();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">某学生.放学();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">这样执行的结果就是学生回寝室吃饭。</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">I人 某老师 = new 老师();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">某老师.开饭();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">某老师.放学();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">这样执行的结果就是老师回家吃饭。</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; 为什么要这样写呢？这样写有什么好处呢？ 我在开饭的时候完全可以直接调用&#8220;学生.吃饭();&#8221;、&#8220;老师.吃饭();&#8221;。接着看,有一天，学校里来了第三种人，家长。 家长既不是去寝室睡觉也不是回家睡觉，而是旅馆睡觉，既不是去食堂吃饭也不是回家吃饭，而是去下馆子。 这个时候学校这个系统该怎么处理呢？ 如果原来没有定义"I人"这个接口那就麻烦啦，所有用到人的地方代码都要改。 现在不一样了，我可以直接定义一个类：家长，这个类实现人这个接口就可以了。 好，看代码：</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">public class 家长:I人</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">{</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 吃饭()</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ //下馆子 }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; public void 睡觉()</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;{ //去旅馆睡觉 }</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; //其它特有方法，比如会见老师，晓之以钱，动之以利等等，不一而足</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">}</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; 在调用的时候不需要修改任何代码，还和原来一样：</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">I人 某家长=new 家长();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">某家长.开饭();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">某家长.放学();</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; 轻松搞定家长的食宿问题！ 这样一来学校来再多的客人都没关系啊，绝对可以应付自如，这也就是传说中的可扩展性！不知道大家看到这里是不是能够明白接口的作用。如果你还不明白，那么你把人这个接口去掉，自己写一个学校开饭和放学的类，然后再加一个家长这个新新人类进去，看看你的代码是什么样子的，再想一下在人口这么多的中国，万一哪天你的学校里来了成千上万个新新人类你该怎么办！</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp; &nbsp; 先声明一下，这个案例可不是我想出来的～～但是很经典，是不？</span><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word; color: #4d4d4d; font-family: 新宋体; font-size: x-small;" /><span style="color: #4d4d4d; font-family: 新宋体; font-size: x-small;">&nbsp;&nbsp;&nbsp; 然后我们就很好理解了，为什么用别人的东西要实现接口呢？很直接的一个原因是这样一来，编程的复杂度就可能会大大降低了，不是么？</span><img src ="http://www.cnitblog.com/yide/aggbug/92292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-24 08:49 <a href="http://www.cnitblog.com/yide/archive/2020/07/24/92292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事件和委托的区别</title><link>http://www.cnitblog.com/yide/archive/2020/07/22/92287.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Wed, 22 Jul 2020 00:40:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/22/92287.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92287.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/22/92287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92287.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92287.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->前言：作为.Net攻城狮，你面试过程中是否遇到过这样的问题呢：什么是事件？事件和委托的区别？既然事件作为一种特殊的委托，那么它的优势如何体现？诸如此类&#8230;你是否也曾经被问到过？你又是否都答出来了呢？<br /><br />关于面试中涉及到的事件的问题，我们只需要抓住几个关键点就好了：<br /><br />（1）事件是委托的封装，可以理解为一种特殊的委托。<br /><br />（2）事件里面其实就两个方法(即add_event()和remove_event())和一个私有的委托变量，这两个方法里面分别是对这个私有的委托变量进行的合并和移除，当调用事件的+=时其实是调用的事件里面的add_event()方法，同样-=调用的是remove_event()方法。<br /><br />（3）事件只能够从对象外部增加新的响应方法和删除已知的响应方法，而不能主动去触发事件和获取其他注册的响应方法等信息。如果使用公有的delegate则不能做这些限制，也就是说事件对委托做了限制，使委托使用起来更加方便。也有人说事件是对委托的阉割，大概也是这个意思。<br /><br />如果回答的时候抓住了以上的3点，那么我想你的面试应该不会太差。毕竟面试那么短的时间，有一两个亮点就很不错了，你说呢。哪怕你对事件机制完全不懂，为了面试记住其中两点也是很好的，工作经验咱们没有，换工作的经验可不能没有哦~~扯远了，关于面试就到此为止。如果你还想继续将事件了解透彻，别着急，慢慢往下看。<br /><br />1、事件的定义及由来：<br /><br />定义事件：<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">delegate</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;MyStudyEvent(<span style="color: #0000FF; ">object</span>&nbsp;sender,&nbsp;EventArgs&nbsp;e);<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestEvent<br />{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">event</span>&nbsp;MyStudyEvent&nbsp;eMyStudyEvent;<br />}<br />&nbsp;<br /><br />将这段代码生成dll后，通过反编译工具reflector我们可以看到：<br /><br />c#&nbsp;基础事件<br /><br />正如上文所说，可以看到当定义一个事件public&nbsp;<span style="color: #0000FF; ">event</span>&nbsp;MyStudyEvent&nbsp;eMyStudyEvent的时候，编译器会自动给他生成两个方法add和remove，以及一个private的委托变量eMyStudyEvent。我们将反编译代码copy出来看看。<br /><br />可以看到这两个方法的主要作用就是在向private变量eMyStudyEvent里面添加委托和移除委托。当调用事件的+=和-=时，eMyStudyEvent里面就合并和移除传过来的委托，当事件触发的时候，eMyStudyEvent变量就执行。这样设计也正好符合封装的原则，保证了内部变量的安全性。<br /><br /><div style="background-color: #eeeeee; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">私有委托变量</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">private</span>&nbsp;MyStudyEvent&nbsp;eMyStudyEvent;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">add方法合并委托到eMyStudyEvent里面</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add_eMyStudyEvent(MyStudyEvent&nbsp;value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;MyStudyEvent&nbsp;event3;<br />&nbsp;&nbsp;&nbsp;&nbsp;MyStudyEvent&nbsp;eMyStudyEvent&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.eMyStudyEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">do</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event3&nbsp;=&nbsp;eMyStudyEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyStudyEvent&nbsp;event4&nbsp;=&nbsp;(MyStudyEvent)System.Delegate.Combine(event3,&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eMyStudyEvent&nbsp;=&nbsp;Interlocked.CompareExchange&lt;MyStudyEvent&gt;(<span style="color: #0000FF; ">ref</span>&nbsp;<span style="color: #0000FF; ">this</span>.eMyStudyEvent,&nbsp;event4,&nbsp;event3)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(eMyStudyEvent&nbsp;!=&nbsp;event3);<br />}<br />&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">remove方法移除eMyStudyEvent里面已存在的委托&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;remove_eMyStudyEvent(MyStudyEvent&nbsp;value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;MyStudyEvent&nbsp;event3;<br />&nbsp;&nbsp;&nbsp;&nbsp;MyStudyEvent&nbsp;eMyStudyEvent&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.eMyStudyEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">do</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event3&nbsp;=&nbsp;eMyStudyEvent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyStudyEvent&nbsp;event4&nbsp;=&nbsp;(MyStudyEvent)System.Delegate.Remove(event3,&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eMyStudyEvent&nbsp;=&nbsp;Interlocked.CompareExchange&lt;MyStudyEvent&gt;(<span style="color: #0000FF; ">ref</span>&nbsp;<span style="color: #0000FF; ">this</span>.eMyStudyEvent,&nbsp;event4,&nbsp;event3);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(eMyStudyEvent&nbsp;!=&nbsp;event3);<br />}</div><br /></div><img src ="http://www.cnitblog.com/yide/aggbug/92287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-22 08:40 <a href="http://www.cnitblog.com/yide/archive/2020/07/22/92287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# ?的作用</title><link>http://www.cnitblog.com/yide/archive/2020/07/21/92286.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Tue, 21 Jul 2020 02:26:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/21/92286.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92286.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/21/92286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92286.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92286.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; 之前最常用的也就是(?:)，最近遇到(?)和(??)感觉还是挺有意思的。<br /><br />1、可空类型修饰符（?）<br /><span style="color: #0000FF; ">int</span>?&nbsp;a&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />对比试试<br /><span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />2、空合并运算符(??)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用于定义可空类型和引用类型的默认值。如果此运算符的左操作数不为null，则此运算符将返回左操作数，否则返回右操作数。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：a&nbsp;??&nbsp;b&nbsp;当a为null时则返回b，a不为null时则返回a本身。<br /><br /><span style="color: #0000FF; ">string</span>&nbsp;a&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><span style="color: #0000FF; ">string</span>&nbsp;b&nbsp;=&nbsp;"b";<br /><span style="color: #0000FF; ">string</span>&nbsp;c&nbsp;=&nbsp;"c";<br />var&nbsp;d&nbsp;=&nbsp;a&nbsp;??&nbsp;b&nbsp;??&nbsp;c;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">"b"</span><span style="color: #008000; "><br /></span>3、三元（运算符）表达式（?:)<br />&nbsp;&nbsp;&nbsp;x?y:z&nbsp;表示如果表达式x为true，则返回y；如果x为false，则返回z，是省略if{}<span style="color: #0000FF; ">else</span>{}的简单形式。<br /><br /><span style="color: #0000FF; ">string</span>&nbsp;a&nbsp;=&nbsp;"a";<br />var&nbsp;b&nbsp;=&nbsp;a&nbsp;==&nbsp;"a"&nbsp;?&nbsp;"a"&nbsp;:&nbsp;"b";&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">"a"</span><span style="color: #008000; "><br /></span>4、具体使用案例：在不报异常的情况下取为null的lst中集合的个数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;<span style="color: #0000FF; ">string</span>&gt;&nbsp;lst&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;a&nbsp;=&nbsp;lst?.Count&nbsp;??&nbsp;0;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">0</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;b&nbsp;=&nbsp;lst&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;0&nbsp;:&nbsp;lst.Count;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">0</span><span style="color: #008000; "><br /></span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />&nbsp;</div><img src ="http://www.cnitblog.com/yide/aggbug/92286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-21 10:26 <a href="http://www.cnitblog.com/yide/archive/2020/07/21/92286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 泛型类语法</title><link>http://www.cnitblog.com/yide/archive/2020/07/21/92285.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Tue, 21 Jul 2020 02:15:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/21/92285.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92285.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/21/92285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92285.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92285.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />泛型将类型参数的概念引入&nbsp;.NET，这样就可设计具有以下特征的类和方法：在客户端代码声明并初始化这些类或方法之前，这些类或方法会延迟指定一个或多个类型。&nbsp;例如，通过使用泛型类型参数&nbsp;T，可以编写其他客户端代码能够使用的单个类，而不会产生运行时转换或装箱操作的成本或风险，如下所示：<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">泛型类语法<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Declare&nbsp;the&nbsp;generic&nbsp;class.</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;GenericList&lt;T&gt;<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">参数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(T&nbsp;input)&nbsp;{&nbsp;}<br />}<br /><span style="color: #0000FF; ">class</span>&nbsp;TestGenericList<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ExampleClass&nbsp;{&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Declare&nbsp;a&nbsp;list&nbsp;of&nbsp;type&nbsp;int.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericList&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;list1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;GenericList&lt;<span style="color: #0000FF; ">int</span>&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list1.Add(1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Declare&nbsp;a&nbsp;list&nbsp;of&nbsp;type&nbsp;string.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericList&lt;<span style="color: #0000FF; ">string</span>&gt;&nbsp;list2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;GenericList&lt;<span style="color: #0000FF; ">string</span>&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list2.Add("");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Declare&nbsp;a&nbsp;list&nbsp;of&nbsp;type&nbsp;ExampleClass.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericList&lt;ExampleClass&gt;&nbsp;list3&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;GenericList&lt;ExampleClass&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list3.Add(<span style="color: #0000FF; ">new</span>&nbsp;ExampleClass());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />泛型类和泛型方法兼具可重用性、类型安全性和效率，这是非泛型类和非泛型方法无法实现的。&nbsp;泛型通常与集合以及作用于集合的方法一起使用。&nbsp;System.Collections.Generic&nbsp;命名空间包含几个基于泛型的集合类。&nbsp;非泛型集合（如&nbsp;ArrayList）不建议使用，并且保留用于兼容性目的。&nbsp;有关详细信息，请参阅&nbsp;.NET&nbsp;中的泛型。</div><img src ="http://www.cnitblog.com/yide/aggbug/92285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-21 10:15 <a href="http://www.cnitblog.com/yide/archive/2020/07/21/92285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 泛型方法语法</title><link>http://www.cnitblog.com/yide/archive/2020/07/21/92284.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Tue, 21 Jul 2020 02:07:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/21/92284.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92284.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/21/92284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92284.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92284.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->泛型方法是通过类型参数声明的方法，如下所示：<br />C#<br /><br />&nbsp;<br /><span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Swap&lt;T&gt;(<span style="color: #0000FF; ">ref</span>&nbsp;T&nbsp;lhs,&nbsp;<span style="color: #0000FF; ">ref</span>&nbsp;T&nbsp;rhs)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;lhs;<br />&nbsp;&nbsp;&nbsp;&nbsp;lhs&nbsp;=&nbsp;rhs;<br />&nbsp;&nbsp;&nbsp;&nbsp;rhs&nbsp;=&nbsp;temp;<br />}<br />如下示例演示使用类型参数的&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;调用方法的一种方式：<br />C#<br /><br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;TestSwap()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b&nbsp;=&nbsp;2;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Swap&lt;<span style="color: #0000FF; ">int</span>&gt;(<span style="color: #0000FF; ">ref</span>&nbsp;a,&nbsp;<span style="color: #0000FF; ">ref</span>&nbsp;b);<br />&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(a&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;b);<br />}<br />还可省略类型参数，编译器将推断类型参数。&nbsp;如下&nbsp;Swap&nbsp;调用等效于之前的调用：<br />C#<br /><br />&nbsp;<br />Swap(<span style="color: #0000FF; ">ref</span>&nbsp;a,&nbsp;<span style="color: #0000FF; ">ref</span>&nbsp;b);<br />类型推理的相同规则适用于静态方法和实例方法。&nbsp;编译器可基于传入的方法参数推断类型参数；而无法仅根据约束或返回值推断类型参数。&nbsp;因此，类型推理不适用于不具有参数的方法。&nbsp;类型推理发生在编译时，之后编译器尝试解析重载的方法签名。&nbsp;编译器将类型推理逻辑应用于共用同一名称的所有泛型方法。&nbsp;在重载解决方案步骤中，编译器仅包含在其上类型推理成功的泛型方法。<br />在泛型类中，非泛型方法可访问类级别类型参数，如下所示：<br />C#<br /><br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;SampleClass&lt;T&gt;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Swap(<span style="color: #0000FF; ">ref</span>&nbsp;T&nbsp;lhs,&nbsp;<span style="color: #0000FF; ">ref</span>&nbsp;T&nbsp;rhs)&nbsp;{&nbsp;}<br />}</div><img src ="http://www.cnitblog.com/yide/aggbug/92284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-21 10:07 <a href="http://www.cnitblog.com/yide/archive/2020/07/21/92284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 泛型</title><link>http://www.cnitblog.com/yide/archive/2020/07/21/92283.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Tue, 21 Jul 2020 00:40:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/21/92283.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92283.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/21/92283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92283.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92283.html</trackback:ping><description><![CDATA[<br /><div style="background-color: #eeeeee; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-size: 13px;">泛型是.NET&nbsp;&nbsp;work&nbsp;2.0&nbsp;版类库就已经提供的语法，主要用于提高代码的可重用性、类型安全性和效率。</span><br /><br /><span style="font-size: 13px;">泛型的定义</span><br /><span style="font-size: 13px;">下面定义了一个普通类和一个泛型类，我们可以明确看到泛型类和普通类最大的区别就是多了一个&lt;T&gt;。</span><br /><br /><span style="font-size: 13px;">所以，这个&lt;T&gt;就标记了，这个类是泛型类。其中这个T，也可以写成A,B,C,D或其他字符。</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;Generic</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;String&nbsp;Name;</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;Generic&lt;T&gt;</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;T&nbsp;Name;</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">泛型，顾名思义，就是泛指的类型。好比男人，女人，白人，黑人，可以泛称为【人】。</span><br /><br /><span style="font-size: 13px;">但类型只能是一个类型。&nbsp;那么泛型和类型之间是什么关系呢？</span><br /><br /><span style="font-size: 13px;">其实很简单，泛型在定义的时候，是泛指类型；在使用的时候，就需要被指定，到底使用哪个类型。</span><br /><br /><span style="font-size: 13px;">即，使用时，就不在是泛指类型，而是特定类型。</span><br /><br /><span style="font-size: 13px;">好比，定义时，定义了一个人。但在使用时，必须明确指定，到底是黑人还是白人。</span><br /><br /><span style="font-size: 13px;">泛型的使用</span><br /><span style="font-size: 13px;">泛型类跟普通类的使用方式一样，都需要实例化对象，再由对象来调用内部的属性或方法。</span><br /><br /><span style="font-size: 13px;">下面代码实例化了泛型Generic，实例化时，还指定了该泛型Generic的指定类型为String。</span><br /><br /><span style="font-size: 13px;">所以要给泛型Generic的属性Name赋值，就需要赋值字符串类型的值。</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">static</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;Excute()</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;Generic&lt;String&gt;&nbsp;gs&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Generic&lt;String&gt;();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;gs.Name&nbsp;=&nbsp;"Kiba518";</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">下面代码定义了一个Int类型的泛型Generic。</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">static</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;Excute()</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;Generic&lt;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&gt;&nbsp;gs&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Generic&lt;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&gt;();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;gs.Name&nbsp;=&nbsp;518;</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">泛型的默认值</span><br /><span style="font-size: 13px;">泛型的默认值，如下面代码所示。需要使用default(T)来赋值。</span><br /><br /><span style="font-size: 13px;">不管泛型到底是String,</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">,bool或者是一个Class类型，都可以被自动赋值。</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">static</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;Excute()</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;Generic&lt;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&gt;&nbsp;gs&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Generic&lt;</span><span style="font-size: 13px; color: #0000ff;">int</span><span style="font-size: 13px;">&gt;();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;gs.Name&nbsp;=&nbsp;518;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;Generic&lt;Task&gt;&nbsp;gsTask&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Generic&lt;Task&gt;();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;gsTask.Name&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Task(()=&gt;&nbsp;{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Kiba518");</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;});</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;Generic&lt;T&gt;</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;T&nbsp;Name&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">default</span><span style="font-size: 13px;">(T);</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">泛型的约束</span><br /><span style="font-size: 13px;">在泛型类中，有个特别的约束可供我们使用。</span><br /><br /><span style="font-size: 13px;">当我们不显示的声明时，这个约束不存在。但当我们显示的声明的时候，这个约束就会执行。</span><br /><br /><span style="font-size: 13px;">下面，我们来看看这个特别的约束。</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">static</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;Excute()</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;Generic&lt;FanXing&gt;&nbsp;gFanXing&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Generic&lt;FanXing&gt;();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;Generic&lt;&nbsp;&gt;&nbsp;gFanXing&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;Generic&lt;&nbsp;&gt;();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #008000;">//</span><span style="font-size: 13px; color: #008000;">Generic&lt;string&gt;&nbsp;gs&nbsp;=&nbsp;new&nbsp;Generic&lt;string&gt;();&nbsp;这样定义会报错</span><span style="font-size: 13px; color: #008000;"><br /></span><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;Generic&lt;T&gt;&nbsp;where&nbsp;T&nbsp;:</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;T&nbsp;Name&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">default</span><span style="font-size: 13px;">(T);</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">string</span><span style="font-size: 13px;">&nbsp;Name&nbsp;{&nbsp;</span><span style="font-size: 13px; color: #0000ff;">get</span><span style="font-size: 13px;">;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">set</span><span style="font-size: 13px;">;&nbsp;}</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;FanXing&nbsp;:</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">string</span><span style="font-size: 13px;">&nbsp;Name&nbsp;{&nbsp;</span><span style="font-size: 13px; color: #0000ff;">get</span><span style="font-size: 13px;">;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">set</span><span style="font-size: 13px;">;&nbsp;}</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">如上面代码所示，【where&nbsp;T&nbsp;:&nbsp;&nbsp;】就是这个特别的约束。</span><br /><br /><span style="font-size: 13px;">当显示声明这个约束的时候，定义会限制泛型的类型。</span><br /><br /><span style="font-size: 13px;">什么是限制泛型的类型呢？</span><br /><br /><span style="font-size: 13px;">很简单，泛型T，是泛指某一个类型。我们在定义泛型类时，还需显示的指定类型，此时我们显示指定的类型，要受这个限制。</span><br /><br /><span style="font-size: 13px;">这个限制就是指【where&nbsp;T&nbsp;:&nbsp;&nbsp;】。</span><br /><br /><span style="font-size: 13px;">它的限制是，要求我们指定的类型T必须是&nbsp;，或者该类型继承自&nbsp;，如FanXing类。</span><br /><br /><span style="font-size: 13px;">泛型的函数</span><br /><br /><span style="font-size: 13px;">在C#中，泛型不仅可以用于类，还可以直接用于函数。</span><br /><br /><span style="font-size: 13px;">具体使用方式如下：</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">static</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;Excute()</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;GenericFunc&nbsp;gf&nbsp;=&nbsp;</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;GenericFunc();</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;gf.FanXingFunc&lt;FanXing&gt;(</span><span style="font-size: 13px; color: #0000ff;">new</span><span style="font-size: 13px;">&nbsp;FanXing()&nbsp;{&nbsp;Name="Kiba518"});</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;GenericFunc</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;FanXingFunc&lt;T&gt;(T&nbsp;obj)</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(obj.GetType());</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;}</span><br /><span style="font-size: 13px;">}</span><br /><br /><span style="font-size: 13px;">//泛型方法</span><br /><div><span style="font-size: 13px;">&nbsp; public T show&lt;T&gt;(T sParameter)</span></div><div><span style="font-size: 13px;">&nbsp; &nbsp; &nbsp; &nbsp; {</span></div><div><span style="font-size: 13px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return sParameter;</span></div><div><span style="font-size: 13px;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></div><br /><span style="font-size: 13px;">很简单，调用泛型函数的时候，指定泛型函数的[指定类型]即可。</span><br /><br /><span style="font-size: 13px;">但是，这里我们发现一个问题，那就是，在泛型函数里，使用泛型对象的时候，我们发现对象都是&nbsp;类型的。</span><br /><br /><span style="font-size: 13px;">那我们如果想使用泛型对象里的属性和方法时，要怎么办呢？</span><br /><br /><span style="font-size: 13px;">也很简单，反射就可以了。</span><br /><br /><span style="font-size: 13px;">下面我们添加一个反射函数GetPropertyValue，专门用来获取属性。</span><br /><br /><span style="font-size: 13px;">&nbsp;</span><br /><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">class</span><span style="font-size: 13px;">&nbsp;GenericFunc</span><br /><span style="font-size: 13px;">{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;</span><span style="font-size: 13px; color: #0000ff;">void</span><span style="font-size: 13px;">&nbsp;FanXingFunc&lt;T&gt;(T&nbsp;obj)</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;name&nbsp;=&nbsp;GetPropertyValue(obj,&nbsp;"Name");</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(name);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;}</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">public</span><span style="font-size: 13px;">&nbsp;&nbsp;GetPropertyValue(&nbsp;obj,&nbsp;</span><span style="font-size: 13px; color: #0000ff;">string</span><span style="font-size: 13px;">&nbsp;name)</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;{</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drv1&nbsp;=&nbsp;obj.GetType().GetProperty(name).GetValue(obj,&nbsp;</span><span style="font-size: 13px; color: #0000ff;">null</span><span style="font-size: 13px;">);</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff;">return</span><span style="font-size: 13px;">&nbsp;drv1;</span><br /><span style="font-size: 13px;">&nbsp;&nbsp;}</span><br /><span style="font-size: 13px;">}</span><br /><span style="font-size: 13px;">输出结果如下：</span><br /><br /><br /><br /><span style="font-size: 13px;">这样我们就得到了我们想要的结果，如果想使用泛型类里的函数，道理也一样，只需要用反射来调用即可。</span><br /><br /><span style="font-size: 13px;">结语</span><br /><span style="font-size: 13px;">看到这里，有些同学可能会觉得泛型很复杂，连使用其对象下的属性，都得反射，太繁琐了，还不如不用呢。</span><br /><br /><span style="font-size: 13px;">有这样想法的同学，心里想想就好了，如果对老司机这么说，他肯定会内心默默的微笑，然后对你说，你想的没错。</span><br /><br /><span style="font-size: 13px;">然后，你就没有然后了。</span><br /><br /><span style="font-size: 13px;">泛型的应用，开篇已经说了，主要用在提高代码的可重用性、类型安全性和效率上。</span><br /><br /><span style="font-size: 13px;">如果只是定义一个类，调用一个属性，那泛型的存在就是鸡肋。</span><br /><br /><span style="font-size: 13px;">但事实上，我们的系统永远只有更复杂，更复杂，更复杂。因此泛型才有了用武之地。</span></div><img src ="http://www.cnitblog.com/yide/aggbug/92283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-21 08:40 <a href="http://www.cnitblog.com/yide/archive/2020/07/21/92283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 字典</title><link>http://www.cnitblog.com/yide/archive/2020/07/20/92281.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Mon, 20 Jul 2020 00:54:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/20/92281.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92281.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/20/92281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92281.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92281.html</trackback:ping><description><![CDATA[<p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">1. 使用字典原因</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp; &nbsp; 通常情况下，我们可以通过int类型的索引号来从数组或者list集合中查询所需的数据。但是如果情况稍微复杂一点：索引号是非int型数据比如string或其他类型该如何操作呢。这个时候我们就可以使用字典了。</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">2. 什么是字典</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp; &nbsp; 顾名思义，字典是一种让我们可以通过索引号查询到特定数据的数据结构类型。</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp; &nbsp; 关键字 DIctionary</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">3. 用法及注意事项</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp;&nbsp; （1）&nbsp; C#的Dictionary&lt;Tkey，TValue&gt;类在内部维护两个数组来实现该功能。一个keys数组容纳要从其映射的键，另一个values容纳映射到的值。在Dictionary&lt;Tkey，TValue&gt;集合中插入键/值对时，将自动记录哪</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp; &nbsp; 个键和哪个值关联，从而允许开发人员快速和简单地获取具有指定键的值。</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp;&nbsp; （2）C#的Dictionary&lt;Tkey，TValue&gt;集合不能包含重复的键。调用Add方法添加键数组中已有的键将抛出异常。但是，如果使用方括号记法（类似给数组元素赋值）来添加键/值对，就不用担心异常&#8212;&#8212;如果键已</p><p style="font-size: 13px; line-height: 1.8; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeeee;">&nbsp; &nbsp; 经存在，其值就会被新值覆盖。可用ContainKey方法测试Dictionary&lt;Tkey，TValue&gt;集合是否已包含特定的键。<br />&nbsp;&nbsp; （3）Dictionary&lt;Tkey，TValue&gt;集合内部采用一种稀疏数据结构，在有大量内存可用时才最高效。随着更多元素的插入，Dictionary&lt;Tkey，TValue&gt;集合可能快速消耗大量内存。<br />&nbsp;&nbsp; （4）用foreach遍历Dictionary&lt;Tkey，TValue&gt;集合返回一个KeyValuePair&lt;Tkey，TValue&gt;。该结构包含数据项的键和值拷贝，可通过Key和Value属性防蚊每个元素。元素是只读的，不能用它们修改Dictionary&lt;Tkey，TValue&gt;集合中的数据。</p><img src ="http://www.cnitblog.com/yide/aggbug/92281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-20 08:54 <a href="http://www.cnitblog.com/yide/archive/2020/07/20/92281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 特性 AttributeUsage</title><link>http://www.cnitblog.com/yide/archive/2020/07/17/92279.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 17 Jul 2020 06:39:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2020/07/17/92279.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/92279.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2020/07/17/92279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/92279.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/92279.html</trackback:ping><description><![CDATA[<br /><br /><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">【<span style="color: #ff0000;"><strong>AttributeUsage</strong></span>】自定义特性时使用</p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　System.AttributeUsage声明一个Attribute的使用范围与使用原则。</p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　<img src="https://images0.cnblogs.com/blog/292994/201409/201541110182670.png" alt="" style="border: none; height: auto; max-width: 100%;" /></p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　AllowMultiple&nbsp;和&nbsp;Inherited&nbsp;参数是可选的，所以此代码具有相同的效果：</p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　<img src="https://images0.cnblogs.com/blog/292994/201409/201541587689948.png" alt="" style="border: none; height: auto; max-width: 100%;" /></p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　AttributeTarget的值可以参考1。部分可取值如下：</p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　<img src="https://images0.cnblogs.com/blog/292994/201409/201545597848684.png" alt="" style="border: none; height: auto; max-width: 100%;" /></p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　如果&nbsp;AllowMultiple&nbsp;参数设置为&nbsp;true，则返回特性可对单个实体应用多次。</p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　如果&nbsp;Inherited&nbsp;设置为&nbsp;false，则该特性不由从特性化的类派生的类继承。</p><p style="margin: 10px auto; color: #000066; font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;">　　Attribute.GetCustomAttribute可以获取一个类的Attribute。<br /><br /></p><div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[AttributeUsage(AttributeTargets.Class)]<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;VersionAttribute&nbsp;:&nbsp;Attribute<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Date&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Describtion&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;[Version(Name&nbsp;=&nbsp;"hyddd",&nbsp;Date&nbsp;=&nbsp;"2009-07-20",&nbsp;Describtion&nbsp;=&nbsp;"hyddd's&nbsp;class")]<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyCode<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><img src="http://www.cnitblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Program<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main(<span style="color: #0000FF; ">string</span>[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;info&nbsp;=&nbsp;<span style="color: #0000FF; ">typeof</span>(MyCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;classAttribute&nbsp;=&nbsp;(VersionAttribute)Attribute.GetCustomAttribute(info,&nbsp;<span style="color: #0000FF; ">typeof</span>(VersionAttribute));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(classAttribute.Name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(classAttribute.Date);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(classAttribute.Describtion);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><img src ="http://www.cnitblog.com/yide/aggbug/92279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2020-07-17 14:39 <a href="http://www.cnitblog.com/yide/archive/2020/07/17/92279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>