C#以流形式传输和接收数据

二进制流形式

发送数据

   Byte[] data= GetGzipByte(json);
   string url = "";
   string result = PostUrl(url, data,EHeaderContentType.gzip);

接收数据

/// <summary>
/// 接收二进制文件
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("ReceiveBinaryFile")]
[Description("接收二进制文件")]
[SwaggerOperation(Summary = "接收二进制文件")]
public async Task<IActionResult> ReceiveBinaryFile()
{
    if (Request.ContentType == "application/octet-stream")
    {
        using (StreamReader sr = new StreamReader(Request.Body))
        {
            var json = await sr.ReadToEndAsync();
            List<DataObject> list = JsonConvert.DeserializeObject<List<DataObject>>(json);
            return Ok("OK");
        }
    }
    else
    {
         return BadRequest("请求头错误");
    }
}

GZIP压缩文件流格式

发送数据

Byte[] data= GetGzipByte(json);   
string url = "";
string result = PostUrl(url, data,EHeaderContentType.gzip);

生成压缩文件流

        public byte[] GetGzipByte(string s)
        {
            byte [] data = Encoding.UTF8.GetBytes(s);
            using (MemoryStream ms = new MemoryStream())
            {
                using (GZipStream gZip = new GZipStream(ms, CompressionMode.Compress))
                {
                    gZip.Write(data, 0, data.Length);
                }
                return ms.ToArray();
            }
        }

接收数据

   [HttpPost]
   [Route("ReceiveGZipFile")]
   [Description("接收GZIP文件")]
   public async IAsyncEnumerable<string> ReceiveGZipFile()
   {
       if (Request.Headers.ContentType == "application/x-gzip")
       {
           using (MemoryStream ms = new MemoryStream())
           {
               await Request.Body.CopyToAsync(ms);
               ms.Seek(0, SeekOrigin.Begin);

               // GZIP 文件头通常以两个字节 1F 8B 开头
               byte[] bytes = new byte[2];
               ms.Read(bytes, 0, 2);
               using (GZipStream gZip = new GZipStream(ms, CompressionMode.Decompress))
               {
                   using (MemoryStream decompressStea = new MemoryStream())
                   {
                       await gZip.CopyToAsync(decompressStea);
                       decompressStea.Seek(0, SeekOrigin.Begin);
                       using (StreamReader reader = new StreamReader(decompressStea))
                       {
                           var json = await reader.ReadToEndAsync();
                           List<ContainerParamVo> List = JsonConvert.DeserializeObject<List<ContainerParamVo>>(json);
                           yield return "OK";
                       }
                   }
               }
           }
       }
       else
       {
           yield return "请求头错误";
       }
   }

附通用接口调用程序

    /// <summary>
    /// 调用接口,最多调用3次,如果3次还为空,则返回
    /// </summary>
    /// <param name="url">接口地址</param>
    /// <param name="param">参数</param>
    /// <param name="contentType">默认为json</param>
    /// <param name="tokenName">token名称,默认为空</param>
    /// <param name="tokenValue">token的值,默认为空</param>
    /// <returns></returns>
    public static string PostUrl(string url, object param, EHeaderContentType contentType = EHeaderContentType.json, string tokenName = "", string tokenValue = "")
    {
        string result = string.Empty;
        int i = 0;
        try
        {
            HttpClient client = new HttpClient();
            client.Timeout = TimeSpan.FromSeconds(3000);
            if (!string.IsNullOrEmpty(tokenName))
            {
                client.DefaultRequestHeaders.Add(tokenName, tokenValue);
            }
            HttpContent data = null;
            switch (contentType)
            {
                case EHeaderContentType.json:
                    data = new StringContent(param.ToString(), Encoding.UTF8, "application/json");
                    break;
                case EHeaderContentType.form_data:
                    // data=new MultipartContent(param.ToString());
                    data = param is HttpContent ? param as HttpContent : null;
                    // data = (HttpContent?)param;
                    break;
                case EHeaderContentType.x_www_form_urlencoded:
                    data = new FormUrlEncodedContent((IEnumerable<KeyValuePair<string, string>>)param);
                    break;
                case EHeaderContentType.binary:
                    data = new ByteArrayContent((byte[])param);
                    data.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
                    break;
                case EHeaderContentType.gzip:
                    data = new ByteArrayContent((byte[])param);
                    data.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-gzip");
                    break;
            }
            while (i < 3 && string.IsNullOrEmpty(result)) //最多调用3次,3次失败则默认接口无法调通
            {
                var response = client.PostAsync(url, data);
                result = response.Result.Content.ReadAsStringAsync().Result;
                i++;
            }
        }
        catch (Exception ex)
        {
            logger.Error($"PostUrl 接口调用失败,url是{url},参数是\r\n{param}\r\n,报错信息是{ex.Message}," +
                $"报错位置是\r\n{ex.StackTrace},报错详情是\r\n{ex.ToString()}!");
        }
        return result;
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值