亚洲必赢手机入口Asp.Net WebAPI核心目标解析(三)Asp.Net WebAPI核心目标解析(三)

by admin on 2018年10月13日

 
 对于.NET的分布式应用开发,可以供我们选择的技艺及框架比较多,例如webservice,.net
remoting,MSMQ,WCF等等技术。对于这些技能很多丁犹无见面生,即时没有尖锐之问询,但是一定听说过,每种技术还各出优势与适用范围,没有绝对的三六九等,只有相对的适合程度。不过可惜了,今天咱们讲解的主题不是马上几乎栽技术,今天主要教学的凡ASP.NET
WebAPI。

 
 对于.NET的分布式应用开发,可以供我们捎的艺以及框架比较多,例如webservice,.net
remoting,MSMQ,WCF等等技术。对于这些技巧很多人犹无会见生,即时没有尖锐之询问,但是得听说过,每种技术都各发优势与适用范围,没有断然的上下,只有相对的相当程度。不过可惜了,今天我们上课的主题不是立几种植技术,今天首要教授的凡ASP.NET
WebAPI。

   对于ASP.NET
WebAPI的优势及特性,在此地虽无开腔了,需要运用的自就是会见选,也不需要自己浪费篇幅去上课这些,这首博文主要讲解ASP.NET
WebAPI中之HTTP消息之布局以及处理消息的主干目标。

   对于ASP.NET
WebAPI的优势以及特色,在这里就是不讲话了,需要用的自然就会选取,也无欲自己浪费篇幅去讲授这些,这篇博文主要教授ASP.NET
WebAPI中的HTTP消息之构造与处理消息之核心目标。

一.WebAPI的HTTP概述:

 
 有关HTTP协议的连带内容以此处就无开牵线,在笔者前面的博文中一度举行过介绍,现在供一下地址,因为过多的废话就是浪费时间,我就是聊看即首博文的读者都对HTTP协议和WebAPI都有了解。博文地址:

http://www.cnblogs.com/pengze0902/p/5976388.html

http://www.cnblogs.com/pengze0902/p/6224792.html

http://www.cnblogs.com/pengze0902/p/6230105.html

一.WebAPI的HTTP概述:

 
 有关HTTP协议的连锁内容在此处虽未做牵线,在笔者前面的博文被早就举行过介绍,现在供一下地址,因为过多的废话就是浪费时间,我虽聊看就篇博文的读者既针对HTTP协议及WebAPI都兼备了解。博文地址:

http://www.cnblogs.com/pengze0902/p/5976388.html

http://www.cnblogs.com/pengze0902/p/6224792.html

http://www.cnblogs.com/pengze0902/p/6230105.html

   1.以.NET4.5前的版中,处理HTTP的主干目标:

     
(1).在客户端:System.Net.HttpWebRequest用于初始化HTTP请求,处理有关的响应; System.Net.HttpWebResponse处理HTTP响应头和数量读取的搜。

     
(2).在服务器端:System.Web.HttpContext,System.Web.HttpRequest,System.Web.HttpResponse类用在ASP.NET上产卵文中,代表单个请求和响应。System.Net.HttpListenerContext类,提供对HTTP请求与应对象的顾。

   1.当.NET4.5之前的本子中,处理HTTP的着力目标:

     
(1).在客户端:System.Net.HttpWebRequest用于初始化HTTP请求,处理有关的响应; System.Net.HttpWebResponse处理HTTP响应头和多少读取的索。

     
(2).在劳动器端:System.Web.HttpContext,System.Web.HttpRequest,System.Web.HttpResponse类用当ASP.NET上产卵文中,代表单个请求和应。System.Net.HttpListenerContext类,提供针对性HTTP请求和响应对象的看。

   2.当.NET4.5版本被,处理HTTP的核心目标:

     
(1).在客户端和劳动器端使用同样的类。(HttpRequestMessage和HttpResponseMessage对象中无含有上下文消息,所以可以当服务器和客户端共用。)

     
(2).由于在.NET4.5遭到引入了TAP(异步任务模型),所以在新的HTTP模型中,处理HTTP请求的办法可采用async和awit实现异步编程。(可以略快速的实现异步编程)

   
我们对新老的HTTP编程模型时,会怪轻之意识以初本子的HTTP模型中,无论是编程的难度与代码编写的精简度,已经履行的频率还是格外高之。在对Web项目的开支被,我们本着HTTP知识之问询是必要的,对于ASP.NET的HTTP处理的原理在此地虽不举行具体的牵线,网上为来较多之稿子可供应阅读和询问。

   
对于ASP.NET的HTTP处理方式的打听,是本身当开微信公众平台时更是深造之,微信公众平台提供了对外访问的接口,我们的次与服务器对微信服务器的接口进行呼吁访问,微信服务器获取HTTP请求后,返回处理结果,本地服务器获取返回结果。这样一个要-响应模式,组成一个对话。对于微信公众平台的出对广大恰恰学习.NET的总人口吧稍高大(当然就是相对而言),即时开发了好频繁者类型的主次的人口(调用第三正值接口的开发)也未必然可以非常清晰的了解这里面的法则,笔者以为对如此的老三在平台的开,其重大的核心部分即使是对于HTTP协议的处理,建立请求、获取响应消息和分析消息随即三非常步骤,返回的音讯内容一般为json或者xml,获取响应消息继,主要是本着信息内容的反序列化,获得消息的实业信息,进而以先后中益处理。

   
在WeAPI中信息的有及剖析,以及信息之格式都是可动态的创办和协议,下面我们更为的了解实现即同经过的中心目标。

   2.当.NET4.5版本被,处理HTTP的主干目标:

     
(1).在客户端以及劳务器端使用同一的切近。(HttpRequestMessage和HttpResponseMessage对象被无含有上下文消息,所以可以当服务器和客户端共用。)

     
(2).由于在.NET4.5面临引入了TAP(异步任务模型),所以于初的HTTP模型中,处理HTTP请求的法门可使async和awit实现异步编程。(可以略高效的贯彻异步编程)

   
我们对此新老的HTTP编程模型时,会那个容易的发现以初本子的HTTP模型中,无论是编程的难度及代码编写的精简度,已经履行之效率都是特别高的。在对Web项目之支出中,我们对HTTP知识的问询是不可或缺之,对于ASP.NET的HTTP处理的规律在这里就是非开具体的牵线,网上为有较多的篇章可供应阅读与了解。

   
对于ASP.NET的HTTP处理方式的问询,是我于开微信公众平台时进一步深造的,微信公众平台供了对外访问的接口,我们的程序与服务器对微信服务器的接口进行呼吁访问,微信服务器获取HTTP请求后,返回处理结果,本地服务器获取返回结果。这样一个请求-响应模式,组成一个会话。对于微信公众平台的支出对众多正学习.NET的人口吧多少高大(当然这是对立而言),即时开发过非常频繁这类型的次的丁(调用第三在接口的出)也未必然可以很清楚的明白之里面的原理,笔者觉得对如此的老三正在平台的付出,其首要的着力组成部分就是对于HTTP协议的拍卖,建立请求、获取响应消息和剖析消息随即三好步骤,返回的音内容类同也json或者xml,获取响应消息继,主要是针对信息内容之反序列化,获得信息的实体信息,进而在程序中逾处理。

   
在WeAPI中信息的发生与剖析,以及信息之格式都是可以动态的创立和磋商,下面我们进一步的了解实现即无异经过的骨干目标。

二.WebAPI的HTTP消息分析:

     
HTTP协议的劳作措施是在客户端和服务器之间交换请求与应消息,那么这吗就可以证明HTTP的核心就是信息,对于“消息”的垂询,我们要掌握消息分为“消息头部”和“消息内容”,我们接下去的指向新HTTP编程模型的牵线的基点虽是“消息头部”和“消息内容”。

     
在命名空间System.Net.Http中,具有两个基本目标:HttpRequestMessage和HttpResponseMessage。两单对象的构造使下图:

亚洲必赢手机入口 1

     
以上要教学了HttpRequestMessage对象以及HttpResponseMessage对象涵盖的重点内容,请求和响应消息还好分包一个可选的音正文,两被信息类型和消息内容,都可以应用应的标头。接下来具体了解一些音讯的组织。

二.WebAPI的HTTP消息分析:

     
HTTP协议的做事办法是在客户端和服务器之间交换请求和应消息,那么这吗即好说明HTTP的中坚就是信息,对于“消息”的垂询,我们如果了解消息分为“消息头部”和“消息内容”,我们接下的对新HTTP编程模型的介绍的本位虽是“消息头部”和“消息内容”。

     
在命名空间System.Net.Http中,具有两个主导目标:HttpRequestMessage和HttpResponseMessage。两单对象的结构要下图:

亚洲必赢手机入口 2

     
以上重大教学了HttpRequestMessage对象与HttpResponseMessage对象涵盖的重中之重内容,请求与应消息还足以涵盖一个可选的消息正文,两饱受信息类型和信息内容,都好运用应的标头。接下来具体了解一些信息之组织。

    1.HttpRequestMessage对象解析:

         (1).HttpRequestMessage主要性能和方式概述:

名称 说明
Version 获取或设置 HTTP 消息版本
Content 获取或设置 HTTP 消息的内容
Method 获取或设置 HTTP 请求信息使用的 HTTP 方法
RequestUri 获取或设置 HTTP 请求的 Uri
Headers 获取 HTTP 请求标头的集合
Properties 获取 HTTP 请求的属性集
ToString 返回表示当前对象的字符串

        该对象主要用于表示 HTTP
请求消息。对于拖欠目标的这些性和道,大部分应有都未会见生,因为一个HTTP消息备受要含有头部、消息内容等等,在此最主要介绍一个性质Properties,该属性并无属另外正式的HTTP消息,当消息传时,不见面保留该属性。

         (2).Properties属性解析:

[__DynamicallyInvokable]
public IDictionary<string, object> Properties
{
    [__DynamicallyInvokable]
    get
    {
        if (this.properties == null)
        {
            this.properties = new Dictionary<string, object>();
        }
        return this.properties;
    }
}

   
有以上的代码可以非常肯定的看看该属性只发生一个但读属性,并返一个IDictionary<string,
object>。当消息在服务器或者客户端本地开展处理常,该属性用于保存附加的信息信息。该属性只是一个通用的器皿,保存本地信息属性。(与受信息之接连相关的客户端认证;将信息及布局路由于进行匹配,得到的路由数据)

    1.HttpRequestMessage对象解析:

         (1).HttpRequestMessage主要性能与道概述:

名称 说明
Version 获取或设置 HTTP 消息版本
Content 获取或设置 HTTP 消息的内容
Method 获取或设置 HTTP 请求信息使用的 HTTP 方法
RequestUri 获取或设置 HTTP 请求的 Uri
Headers 获取 HTTP 请求标头的集合
Properties 获取 HTTP 请求的属性集
ToString 返回表示当前对象的字符串

        该目标主要用于表示 HTTP
请求消息。对于该对象的这些性与方,大部分当都非会见生,因为一个HTTP消息被要涵盖头部、消息内容等等,在此间根本介绍一个性Properties,该属性并无属另外专业的HTTP消息,当消息传时,不见面保留该属性。

         (2).Properties属性解析:

[__DynamicallyInvokable]
public IDictionary<string, object> Properties
{
    [__DynamicallyInvokable]
    get
    {
        if (this.properties == null)
        {
            this.properties = new Dictionary<string, object>();
        }
        return this.properties;
    }
}

   
有以上的代码可以生显的视该属性只发一个光读属性,并返回一个IDictionary<string,
object>。当消息在服务器或者客户端本地开展处理常,该属性用于保存附加的音信信息。该属性只是一个通用的器皿,保存本地信息属性。(与受信息之连接相关的客户端认证;将消息及配置路由于进行匹配,得到的路由数据)

   2.HttpResponseMessage对象解析:

        (1).HttpRequestMessage主要性能和章程概述:

名称 说明
EnsureSuccessStatusCode 如果 HTTP 响应的 IsSuccessStatusCode 属性为  false, 将引发异常
StatusCode 获取或设置 HTTP 响应的状态代码
ReasonPhrase 获取或设置服务器与状态代码通常一起发送的原因短语
RequestMessage 获取或设置导致此响应消息的请求消息
IsSuccessStatusCode 获取一个值,该值指示 HTTP 响应是否成功

     
对于拖欠目标的有些性质没有列举,因为当HttpRequestMessage对象就介绍,如:Version、Content、Headers等,该对象要用以表示
HTTP 响应消息。在此间根本介绍StatusCode属性。

       (2).StatusCode属性:

[__DynamicallyInvokable]
public HttpStatusCode StatusCode
{
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    get
    {
        return this.statusCode;
    }
    [__DynamicallyInvokable]
    set
    {
        if ((value < ((HttpStatusCode) 0)) || (value > ((HttpStatusCode) 0x3e7)))
        {
            throw new ArgumentOutOfRangeException("value");
        }
        this.CheckDisposed();
        this.statusCode = value;
    }
}

   
 StatusCode属性为枚举属性,该属性可读而写,对于状态码这个定义,很多口且是于了解的,在HTTP协议被,状态码主要是表示以信之求在服务器被拍卖的结果,状态有2XX,3XX,4XX,5XX等等,具体表示的意义就是不再描述。

   2.HttpResponseMessage对象解析:

        (1).HttpRequestMessage主要性能与道概述:

名称 说明
EnsureSuccessStatusCode 如果 HTTP 响应的 IsSuccessStatusCode 属性为  false, 将引发异常
StatusCode 获取或设置 HTTP 响应的状态代码
ReasonPhrase 获取或设置服务器与状态代码通常一起发送的原因短语
RequestMessage 获取或设置导致此响应消息的请求消息
IsSuccessStatusCode 获取一个值,该值指示 HTTP 响应是否成功

     
对于拖欠对象的部分性质没有列举,因为以HttpRequestMessage对象已经介绍,如:Version、Content、Headers等,该对象要用以表示
HTTP 响应消息。在此主要介绍StatusCode属性。

       (2).StatusCode属性:

[__DynamicallyInvokable]
public HttpStatusCode StatusCode
{
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    get
    {
        return this.statusCode;
    }
    [__DynamicallyInvokable]
    set
    {
        if ((value < ((HttpStatusCode) 0)) || (value > ((HttpStatusCode) 0x3e7)))
        {
            throw new ArgumentOutOfRangeException("value");
        }
        this.CheckDisposed();
        this.statusCode = value;
    }
}

   
 StatusCode属性为枚举属性,该属性可读而写,对于状态码这个概念,很多总人口且是于了解的,在HTTP协议被,状态码主要是表示于信息之恳求在服务器被拍卖的结果,状态产生2XX,3XX,4XX,5XX等等,具体表示的意义就不再描述。

     3.HTTP模消息标头解析:

         
在HTTP中,请求与应消息,以及信息内容我,都好下称为标头的附加字段,包含重复多之音信。

       (1).标头分类:

标头名称 描述 HTTP模型标头容器类
User-Agent 为请求提供扩展信息,描述产生这个请求的应用程序 HttpRequestHeaders
Server 为响应提供关于源服务器软件的扩展信息 HttpResponseHeaders
Content-Type 定义请求或响应有效载荷正文中,资源表示使用的媒体类型 HttpContentHeaders

       (2).HttpHeaders抽象类分析:

名称 描述
Add 添加指定的标头及其值到 HttpHeaders 集合中。
TryAddWithoutValidation 返回一个值,该值指示指定标头及其值是否已添加到HttpHeaders 集合,而未验证所提供的信息。
Clear 从 HttpHeaders 集合中移除所有标头。
Remove 从HttpHeaders集合中移除指定的标头。
GetValues 返回存储在HttpHeaders 集合中所有指定标头的标头值。
Contains 如果指定标头存在于 HttpHeaders 集合则返回。
ToString 返回表示当前 HttpHeaders对象的字符串。

     
 HttpHeaders是一个抽象类,HttpRequestHeaders、HttpResponseHeaders、HttpContentHeaders三只类似继承了此类。接下来我们来询问一下Add()方法:

[__DynamicallyInvokable]
public void Add(string name, string value)
{
    HeaderStoreItemInfo info;
    bool flag;
    this.CheckHeaderName(name);
    this.PrepareHeaderInfoForAdd(name, out info, out flag);
    this.ParseAndAddValue(name, info, value);
    if (flag && (info.ParsedValue != null))
    {
        this.AddHeaderToStore(name, info);
    }
}

     
 Add()方法有两只重载版本,该法好于容器添加标头,如果只要添加的标头有标准名,在累加之前标头值会进展说明。Add方法还会证明标头是否好生多个价。

     3.HTTP型消息标头解析:

         
在HTTP中,请求和应消息,以及信息内容我,都足以以称为标头的附加字段,包含重复多之信。

       (1).标头分类:

标头名称 描述 HTTP模型标头容器类
User-Agent 为请求提供扩展信息,描述产生这个请求的应用程序 HttpRequestHeaders
Server 为响应提供关于源服务器软件的扩展信息 HttpResponseHeaders
Content-Type 定义请求或响应有效载荷正文中,资源表示使用的媒体类型 HttpContentHeaders

       (2).HttpHeaders抽象类分析:

名称 描述
Add 添加指定的标头及其值到 HttpHeaders 集合中。
TryAddWithoutValidation 返回一个值,该值指示指定标头及其值是否已添加到HttpHeaders 集合,而未验证所提供的信息。
Clear 从 HttpHeaders 集合中移除所有标头。
Remove 从HttpHeaders集合中移除指定的标头。
GetValues 返回存储在HttpHeaders 集合中所有指定标头的标头值。
Contains 如果指定标头存在于 HttpHeaders 集合则返回。
ToString 返回表示当前 HttpHeaders对象的字符串。

     
 HttpHeaders是一个抽象类,HttpRequestHeaders、HttpResponseHeaders、HttpContentHeaders三个像样继承了此类。接下来我们来打探一下Add()方法:

[__DynamicallyInvokable]
public void Add(string name, string value)
{
    HeaderStoreItemInfo info;
    bool flag;
    this.CheckHeaderName(name);
    this.PrepareHeaderInfoForAdd(name, out info, out flag);
    this.ParseAndAddValue(name, info, value);
    if (flag && (info.ParsedValue != null))
    {
        this.AddHeaderToStore(name, info);
    }
}

     
 Add()方法有两只重载版本,该办法好于容器添加标头,如果只要添加的标头有标准名,在增长之前标头值会进展说明。Add方法还会见证明标头是否好生多独价。

   4.HTTP消息内容分析:

     
在.NET4.5本的HTTP模型中,HTTP消息之正文由抽象基类HttpContent表示,HttpResponseMessage和HttpRequestMessage对象还包含一个HttpContent类型的Content属性。

     (1).HttpContent主要性能和法:

名称 描述
ReadAsByteArrayAsync 以异步操作将 HTTP 内容写入字节数组。
SerializeToStreamAsync 以异步操作将 HTTP 内容序列化到流。
CopyToAsync 以异步操作将 HTTP 内容写入流。
LoadIntoBufferAsync 以异步操作将 HTTP 内容序列化到内存缓冲区。
CreateContentReadStreamAsync 以异步操作将 HTTP 内容写入内存流。
TryComputeLength 确定 HTTP 内容是否具备有效的字节长度。
Headers 根据 RFC 2616 中的定义,获取内容标头。

     (2).CopyToAsync()方法分析:

[__DynamicallyInvokable]
public Task CopyToAsync(Stream stream, TransportContext context)
{
    Action<Task> continuation = null;
    this.CheckDisposed();
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    try
    {
        Task task = null;
        if (this.IsBuffered)
        {
            task = Task.Factory.FromAsync<byte[], int, int>(new Func<byte[], int, int, 
            AsyncCallback, object, IAsyncResult>(stream.BeginWrite), new Action<IAsyncResult>(stream.EndWrite), 
       this.bufferedContent.GetBuffer(), 0, (int) this.bufferedContent.Length, null);
        }
        else
        {
            task = this.SerializeToStreamAsync(stream, context);
            this.CheckTaskNotNull(task);
        }
        if (continuation == null)
        {
            continuation = delegate (Task copyTask) {
                if (copyTask.IsFaulted)
                {
                    tcs.TrySetException(GetStreamCopyException(copyTask.Exception.GetBaseException()));
                }
                else if (copyTask.IsCanceled)
                {
                    tcs.TrySetCanceled();
                }
                else
                {
                    tcs.TrySetResult(null);
                }
            };
        }
        task.ContinueWithStandard(continuation);
    }
    catch (IOException exception)
    {
        tcs.TrySetException(GetStreamCopyException(exception));
    }
    catch (ObjectDisposedException exception2)
    {
        tcs.TrySetException(GetStreamCopyException(exception2));
    }
    return tcs.Task;
}

   
在应用信息内容常常,需要利用HtppContent的法门要扩展方法。在HttpContent中动用CopyToAsync()方法以推送方式访原本之消息内容,由方代码可以见见,该方式接受两独参数,一个凡流对象,一个是有关传输的音(例如,通道绑定),此参数可以啊
null。该措施好将信息内容写副到此流中。

    在该措施的贯彻代码中
创建了一个TaskCompletionSource<object>的泛型对象,该目标表示未绑定到委托的 Task<TResult> 的制造者方,并透过 Task 属性提供对使用者正在的访。SerializeToStreamAsync方法将盛传的流对象序列化,该办法呢异步方法。

   
我们需要留意的几触及,主要为委托的创立与应用,在C#遭逢,尽量用有.NET提供的委托类,不要自己失去创造。还有某些虽是以先后中对生的处理方式,异常的破获具有层次性,并且调用了由定义的一个怪处理方式TrySetException。

    (2).ReadAsStreamAsync()方法分析:

     
在赢得旧消息内容常常,除了调用上面介绍的方式外,还可以调用ReadAsStreamAsync()方法为拉取的法子访原本之音内容。

     
在HttpContent中包含有另外两个像样之章程,ReadAsStringAsync()和ReadAsByteArrayAsync()异步的提供信息内容之缓冲副本,ReadAsByteArrayAsync()返回原的字节内容,ReadAsStringAsync()将内容解码为字符串返回。

   4.HTTP音讯内容分析:

     
在.NET4.5本的HTTP模型中,HTTP消息之正文由抽象基类HttpContent表示,HttpResponseMessage和HttpRequestMessage对象还包含一个HttpContent类型的Content属性。

     (1).HttpContent主要性能和道:

名称 描述
ReadAsByteArrayAsync 以异步操作将 HTTP 内容写入字节数组。
SerializeToStreamAsync 以异步操作将 HTTP 内容序列化到流。
CopyToAsync 以异步操作将 HTTP 内容写入流。
LoadIntoBufferAsync 以异步操作将 HTTP 内容序列化到内存缓冲区。
CreateContentReadStreamAsync 以异步操作将 HTTP 内容写入内存流。
TryComputeLength 确定 HTTP 内容是否具备有效的字节长度。
Headers 根据 RFC 2616 中的定义,获取内容标头。

     (2).CopyToAsync()方法分析:

[__DynamicallyInvokable]
public Task CopyToAsync(Stream stream, TransportContext context)
{
    Action<Task> continuation = null;
    this.CheckDisposed();
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    try
    {
        Task task = null;
        if (this.IsBuffered)
        {
            task = Task.Factory.FromAsync<byte[], int, int>(new Func<byte[], int, int, 
            AsyncCallback, object, IAsyncResult>(stream.BeginWrite), new Action<IAsyncResult>(stream.EndWrite), 
       this.bufferedContent.GetBuffer(), 0, (int) this.bufferedContent.Length, null);
        }
        else
        {
            task = this.SerializeToStreamAsync(stream, context);
            this.CheckTaskNotNull(task);
        }
        if (continuation == null)
        {
            continuation = delegate (Task copyTask) {
                if (copyTask.IsFaulted)
                {
                    tcs.TrySetException(GetStreamCopyException(copyTask.Exception.GetBaseException()));
                }
                else if (copyTask.IsCanceled)
                {
                    tcs.TrySetCanceled();
                }
                else
                {
                    tcs.TrySetResult(null);
                }
            };
        }
        task.ContinueWithStandard(continuation);
    }
    catch (IOException exception)
    {
        tcs.TrySetException(GetStreamCopyException(exception));
    }
    catch (ObjectDisposedException exception2)
    {
        tcs.TrySetException(GetStreamCopyException(exception2));
    }
    return tcs.Task;
}

   
在采取信息内容时,需要使用HtppContent的道或者扩展方法。在HttpContent中使用CopyToAsync()方法为推送方式访原本之音内容,由艺术代码可以望,该法接受两只参数,一个凡流动对象,一个是关于传输的消息(例如,通道绑定),此参数可以吗
null。该办法好把信息内容写副到者流中。

    在拖欠办法的兑现代码中
创建了一个TaskCompletionSource<object>的泛型对象,该目标表示不绑定到委托的 Task<TResult> 的制造者方,并经过 Task 属性提供对使用者在的造访。SerializeToStreamAsync方法将盛传的流对象序列化,该措施为异步方法。

   
我们用专注的几沾,主要为委托的创始和采取,在C#遭遇,尽量用有.NET提供的委托类,不要自己去创造。还有一些即便是当先后中针对老的处理方式,异常的捕获具有层次性,并且调用了起定义之一个异常处理办法TrySetException。

    (2).ReadAsStreamAsync()方法分析:

     
在收获旧消息内容常常,除了调用上面介绍的点子外,还可调用ReadAsStreamAsync()方法为拉取之章程访原本的信内容。

     
在HttpContent中蕴含有另外两独八九不离十的不二法门,ReadAsStringAsync()和ReadAsByteArrayAsync()异步的提供信息内容的缓冲副本,ReadAsByteArrayAsync()返回原的字节内容,ReadAsStringAsync()将内容解码为字符串返回。

三.DotNet中初老HTTP模型分析:

三.DotNet中初老HTTP模型分析:

   1..NET4.5之前版本创建HTTP POST请求实例:

        public static string HttpPost(string postUrl, string postData)
        {
            if (string.IsNullOrEmpty(postUrl))
                throw new ArgumentNullException(postUrl);
            if (string.IsNullOrEmpty(postData))
                throw new ArgumentNullException(postData);
            var request = WebRequest.Create(postUrl) as HttpWebRequest;
            if (request == null)
                throw new ArgumentNullException("postUrl");
            try
            {
                var cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                var data = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = data.Length;
                var outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据,获取对应HTTP请求的响应
                var response = request.GetResponse() as HttpWebResponse;
                if (response != null)
                {
                    var instream = response.GetResponseStream();
                    var content = string.Empty;
                    if (instream == null)
                    {
                        return content;
                    }
                    using (var sr = new StreamReader(instream, Encoding.UTF8))
                    {
                        content = sr.ReadToEnd();
                    }
                    return content;
                }
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (IOException ioex)
            {
                throw ioex;
            }
            return null;
        }

   1..NET4.5事先版本创建HTTP POST请求实例:

        public static string HttpPost(string postUrl, string postData)
        {
            if (string.IsNullOrEmpty(postUrl))
                throw new ArgumentNullException(postUrl);
            if (string.IsNullOrEmpty(postData))
                throw new ArgumentNullException(postData);
            var request = WebRequest.Create(postUrl) as HttpWebRequest;
            if (request == null)
                throw new ArgumentNullException("postUrl");
            try
            {
                var cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                var data = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = data.Length;
                var outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据,获取对应HTTP请求的响应
                var response = request.GetResponse() as HttpWebResponse;
                if (response != null)
                {
                    var instream = response.GetResponseStream();
                    var content = string.Empty;
                    if (instream == null)
                    {
                        return content;
                    }
                    using (var sr = new StreamReader(instream, Encoding.UTF8))
                    {
                        content = sr.ReadToEnd();
                    }
                    return content;
                }
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (IOException ioex)
            {
                throw ioex;
            }
            return null;
        }

   2..NET4.5本子创建HTTP POST请求实例:

async static void getResponse(string url)
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync(url))
                {
                    using (HttpContent content = response.Content)
                    {
                        string myContent = await content.ReadAsStringAsync();
                    }
                }
            }
        }
        async static void postResponse(string url)
        {
            while (true)
            {
                IEnumerable<KeyValuePair<string, string>> queries = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string> ("test","test")
            };
                HttpContent q = new FormUrlEncodedContent(queries);
                using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = await client.PostAsync(url, q))
                    {
                        using (HttpContent content = response.Content)
                        {
                            string myContent = await content.ReadAsStringAsync();

                            Console.WriteLine(myContent);
                        }
                    }
                }
            }
        }

   2..NET4.5本创建HTTP POST请求实例:

async static void getResponse(string url)
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync(url))
                {
                    using (HttpContent content = response.Content)
                    {
                        string myContent = await content.ReadAsStringAsync();
                    }
                }
            }
        }
        async static void postResponse(string url)
        {
            while (true)
            {
                IEnumerable<KeyValuePair<string, string>> queries = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string> ("test","test")
            };
                HttpContent q = new FormUrlEncodedContent(queries);
                using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = await client.PostAsync(url, q))
                    {
                        using (HttpContent content = response.Content)
                        {
                            string myContent = await content.ReadAsStringAsync();

                            Console.WriteLine(myContent);
                        }
                    }
                }
            }
        }

四.总结:

 
 以上要教授了.NET4.5事先跟事后版本对HTTP编程模式的有情节, 两者的第一分在于.NET4.5版本之前的HTTP编程模型会区分客户端和服务器,两者采用的对象存在不同,实现的原理及则在一定之相似性,但是使用的切近可今非昔比。.NET4.5之后的版被,对象的使没有客户端和服务器的分,两者可以共用。

四.总结:

 
 以上要教学了.NET4.5前跟后版本对HTTP编程模式之一些情节, 两者的显要区别在于.NET4.5版本之前的HTTP编程模型会区分客户端和服务器,两者采用的对象有不同,实现之法则及虽是必然的相似性,但是用的类似可不比。.NET4.5后头的本被,对象的使没有客户端以及服务器的分,两者可以共用。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图