欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Asp.NetCore控制器怎么接收原始請(qǐng)求正文內(nèi)容-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)公司專(zhuān)注于桑日企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,購(gòu)物商城網(wǎng)站建設(shè)。桑日網(wǎng)站建設(shè)公司,為桑日等地區(qū)提供建站服務(wù)。全流程定制制作,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

主要目標(biāo)


在Asp.net Core控制器中,通過(guò)自定義格式化程序來(lái)映射自定義處理控制器中的“未知”內(nèi)容。本文將給大家詳細(xì)介紹關(guān)于Asp.Net Core控制器接收原始請(qǐng)求正文內(nèi)容的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

簡(jiǎn)單案例


為了演示這個(gè)問(wèn)題,我們用VS2017創(chuàng)建一個(gè)默認(rèn)的Asp.net Core Web Api項(xiàng)目。


 [Route("api/[controller]")]
 [ApiController]
 public class ValuesController : ControllerBase{
 [HttpGet]
 public ActionResult<string> Get() {
  return "ok";
 }

 [HttpPost]
 [Route("PostX")]
 public ActionResult<string> Post([FromBody] string value)
 {
  return value;
 }
 }

Json請(qǐng)求


我們從最常見(jiàn)的json輸入請(qǐng)求開(kāi)始。

User-Agent: Fiddler
Host: localhost:5000
Content-Type: application/json
Content-Length: 16

請(qǐng)求body:

{"123456"}

通過(guò)后臺(tái)調(diào)試和fiddler抓包,我們可以看到請(qǐng)求輸入和返回。


Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容

后臺(tái)調(diào)試,查看請(qǐng)求輸入結(jié)果

Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容

fiddler查看請(qǐng)求header

Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容

fiddler查看返回結(jié)果


注意!!

別忘了[FromBody],有時(shí)候會(huì)忘的。
后臺(tái)action接收類(lèi)型為string的時(shí)候,請(qǐng)求body只能是字符串,不能傳json對(duì)象。我演示這個(gè)例子時(shí),被這點(diǎn)坑了。如果接收對(duì)象是一個(gè)類(lèi)的時(shí)候,才可以傳json對(duì)象。


沒(méi)有JSON


雖然傳輸json數(shù)據(jù)是最常用的,但有時(shí)候我們需要支持普通的文本或者二進(jìn)制信息。我們將Content-Type改為
text/plain

User-Agent: Fiddler
Host: localhost:5000
Content-Type:text/plain
Content-Length: 16

請(qǐng)求body:

{"123456"}

悲劇的事情來(lái),報(bào)404!

Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容
不支持text/plain


事情到此就變得稍微復(fù)雜了一些,因?yàn)閍sp.netcore只處理它認(rèn)識(shí)的類(lèi)型,如json和formdata。默認(rèn)情況下,原始數(shù)據(jù)不能直接映射到控制器參數(shù)。這是個(gè)小坑,不知你踩到過(guò)沒(méi)有?仔細(xì)想想,這是有道理的。MVC具有特定內(nèi)容類(lèi)型的映射,如果您傳遞的數(shù)據(jù)不符合這些內(nèi)容類(lèi)型,則無(wú)法轉(zhuǎn)換數(shù)據(jù),因此它假定沒(méi)有匹配的端點(diǎn)可以處理請(qǐng)求。
那么怎么支持原始的請(qǐng)求映射呢?

支持原始正文請(qǐng)求


不幸的是,ASP.NET Core不允許您僅通過(guò)方法參數(shù)以任何有意義的方式捕獲“原始”數(shù)據(jù)。無(wú)論如何,您需要對(duì)其進(jìn)行一些自定義處理Request.Body以獲取原始數(shù)據(jù),然后對(duì)其進(jìn)行反序列化。

您可以捕獲原始數(shù)據(jù)Request.Body并從中直接讀取原始緩沖區(qū)。

最簡(jiǎn)單,最不易侵入,但不那么明顯的方法是使用一個(gè)方法接受沒(méi)有參數(shù)的 POST或PUT數(shù)據(jù),然后從Request.Body以下位置讀取原始數(shù)據(jù):

讀取字符串緩沖區(qū)


 [HttpPost]
 [Route("PostText")]
 public async Task<string> PostText()
 {
  using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
  {
  return await reader.ReadToEndAsync();
  }
 }

這適用于一下Http和文本

User-Agent: Fiddler
Host: localhost:5000
Content-Type: text/plain
Content-Length: 6

要讀取二進(jìn)制數(shù)據(jù),你可以使用以下內(nèi)容:

讀取byte緩沖區(qū)


 [HttpPost]
 [Route("PostBinary")]
 public async Task<byte[]> PostBinary()
 {
  using (var ms = new MemoryStream(2048))
  {
  await Request.Body.CopyToAsync(ms);
  return ms.ToArray(); // returns base64 encoded string JSON result
  }
 }

查看執(zhí)行結(jié)果


Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容

接收文本內(nèi)容

Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容

接收二進(jìn)制數(shù)據(jù)


HttpRequest靜態(tài)擴(kuò)展


如果你為了方便,寫(xiě)了很多HttpRequest的擴(kuò)展,接收參數(shù)時(shí),可以看起來(lái)更簡(jiǎn)潔一些。

public static class HttpRequestExtension
 {
 /// <summary>
 /// 
 /// </summary>
 /// <param name="httpRequest"></param>
 /// <param name="encoding"></param>
 /// <returns></returns>
 public static async Task<string> GetRawBodyStringFormater(this HttpRequest httpRequest, Encoding encoding)
 {
  if (encoding == null)
  {
  encoding = Encoding.UTF8;
  }

  using (StreamReader reader = new StreamReader(httpRequest.Body, encoding))
  {
  return await reader.ReadToEndAsync();
  }
 }
 /// <summary>
 /// 二進(jìn)制
 /// </summary>
 /// <param name="httpRequest"></param>
 /// <param name="encoding"></param>
 /// <returns></returns>
 public static async Task<byte[]> GetRawBodyBinaryFormater(this HttpRequest httpRequest, Encoding encoding)
 {
  if (encoding == null)
  {
  encoding = Encoding.UTF8;
  }

  using (StreamReader reader = new StreamReader(httpRequest.Body, encoding))
  {
  using (var ms = new MemoryStream(2048))
  {
   await httpRequest.Body.CopyToAsync(ms);
   return ms.ToArray(); // returns base64 encoded string JSON result
  }
  }
 }
 }
 [HttpPost]
 [Route("PostTextX")]
 public async Task<string> PostTextX()
 {
  return await Request.GetRawBodyStringAsyn();
 }
 /// <summary>
 /// 接收
 /// </summary>
 /// <returns></returns>
 [HttpPost]
 [Route("PostBinaryX")]
 public async Task<byte[]> PostBinaryX()
 {
  return await Request.GetRawBodyBinaryAsyn();
 }

自動(dòng)轉(zhuǎn)換文本和二進(jìn)制值


上面雖然解決了原始參數(shù)轉(zhuǎn)換問(wèn)題,但不夠友好。如果你打算像原生MVC那樣自動(dòng)映射參數(shù)的話,你需要做一些自定義格式化適配。

創(chuàng)建一個(gè)Asp.net MVC InputFormatter


ASP.NET Core使用一種干凈且更通用的方式來(lái)處理內(nèi)容的自定義格式InputFormatter。輸入格式化程序掛鉤到請(qǐng)求處理管道,讓您查看特定類(lèi)型的內(nèi)容以確定是否要處理它。然后,您可以閱讀請(qǐng)求正文并對(duì)入站內(nèi)容執(zhí)行自己的反序列化。


InputFormatter有幾個(gè)要求

  • 您需要使用[FromBody]去獲取

  • 您必須能夠查看請(qǐng)求并確定是否以及如何處理內(nèi)容。

在這個(gè)例子中,對(duì)于“原始內(nèi)容”,我想查看具有以下類(lèi)型的請(qǐng)求:

  • text/plain(文本)

  • appliaction/octet-stream(byte[])
     沒(méi)有內(nèi)容類(lèi)型(string)

要?jiǎng)?chuàng)建格式化程序,你可以實(shí)現(xiàn)IInputFormatter或者從InputFormatter繼承。

 public class RawRequestBodyFormatter : IInputFormatter
 {
  public RawRequestBodyFormatter()
  {

  }

  public bool CanRead(InputFormatterContext context)
  {
   if (context == null) throw new ArgumentNullException("argument is Null");
   var contentType = context.HttpContext.Request.ContentType;
   if (string.IsNullOrEmpty(contentType) || contentType == "text/plain" || contentType == "application/octet-stream")
    return true;
   return false;
  }

  public async Task<InputFormatterResult> ReadAsync(InputFormatterContext context)
  {
   var request = context.HttpContext.Request;
   var contentType = context.HttpContext.Request.ContentType;
   if (string.IsNullOrEmpty(contentType) || contentType.ToLower() == "text/plain")
   {
    using (StreamReader reader = new StreamReader(request.Body, Encoding.UTF8))
    {
     var content = await reader.ReadToEndAsync();
     return await InputFormatterResult.SuccessAsync(content);
    }
   }
   if (contentType == "application/octet-stream")
   {
    using (StreamReader reader = new StreamReader(request.Body, Encoding.UTF8))
    {
     using (var ms = new MemoryStream(2048))
     {
      await request.Body.CopyToAsync(ms);
      var content = ms.ToArray();

      return await InputFormatterResult.SuccessAsync(content);
     }
    }
   }
   return await InputFormatterResult.FailureAsync();
  }
 }

格式化程序用于CanRead()檢查對(duì)內(nèi)容類(lèi)型的請(qǐng)求以支持,然后將ReadRequestBodyAsync()內(nèi)容讀取和反序列化為應(yīng)在控制器方法的參數(shù)中返回的結(jié)果類(lèi)型。

InputFormatter必須在ConfigureServices()啟動(dòng)代碼中注冊(cè)MVC :

 public void ConfigureServices(IServiceCollection services)
  {
   services.AddMvc(o=>o.InputFormatters.Insert(0,new RawRequestBodyFormatter())).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  }

接受原始輸入


  [HttpPost]
  [Route("PostTextPlus")]
  public string PostTextPlus([FromBody] string value)
  {
   return value;
  }

然后你就可以發(fā)送post請(qǐng)求,像這樣:

User-Agent: Fiddler
Host: localhost:5000
Content-Length: 6

或者

User-Agent: Fiddler
Host: localhost:5000
Content-Type:text/plain
Content-Length: 6

請(qǐng)注意,您可以使用內(nèi)容類(lèi)型調(diào)用相同的控制器方法application/json并傳遞JSON字符串,這也將起作用。在RawRequestBodyFormatter 簡(jiǎn)單地增加它支持的附加內(nèi)容類(lèi)型的支持。

二進(jìn)制數(shù)據(jù)


  [HttpPost]
  [Route("PostBinaryPlus")]
  public byte[] PostBinaryPlus([FromBody] byte[] value)
  {
   return value;
  }

請(qǐng)求內(nèi)容如下:

User-Agent: Fiddler
Host: localhost:5000
Content-Length: 6
Content-Type: application/octet-stream

感謝各位的閱讀!關(guān)于“Asp.Net Core控制器怎么接收原始請(qǐng)求正文內(nèi)容”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

分享題目:Asp.NetCore控制器怎么接收原始請(qǐng)求正文內(nèi)容-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://www.chinadenli.net/article14/dhchde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)企業(yè)建站網(wǎng)站導(dǎo)航網(wǎng)站營(yíng)銷(xiāo)定制網(wǎng)站用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)