C# Post數據或文件到指定的服務器進行接收

目錄

應用場景

實現原理

實現代碼

PostAnyWhere類

ashx文件部署

小結?


應用場景

不同的接口服務器處理不同的應用,我們會在實際應用中將A服務器的數據提交給B服務器進行數據接收并處理業務。

比如我們想要處理一個OFFICE文件,由用戶上傳到A服務器,上傳成功后,由B服務器負責進行數據處理和下載工作,這時我們就需要 POST A服務器的文件數據到B服務器進行處理。

實現原理

將用戶上傳的數據或A服務器已存在的數據,通過form-data的形式POST到B服務器,B服務由指定ashx文件進行數據接收,并轉由指定的業務邏輯程序進行處理。如下圖:

實現代碼

PostAnyWhere類

創建一個 PostAnyWhere 類,

該類具有如下屬性:

(1)public string PostUrl? ? ?要提交的服務器URL
(2)public List<PostFileItem> PostData? ?要準備的數據(PostFileItem類可包括數據和文件類型)

該類包含的關鍵方法如下:

(1)public void AddText(string key, string value)

? ? ? ? ?該方法將指定的字典數據加入到PostData中

(2)public void AddFile(string name, string srcFileName, string desName,?string contentType = "text/plain")

? ? ? ? ?該方法將指定的文件添加到PostData中,其中 srcFileName 表示要添加的文件名,desName表示接收數據生成的文件名

(3)public string Send()?

? ? ? ? ?該方法將開始POST傳送數據

代碼如下:

    public class PostAnyWhere{public string PostUrl { get; set; }public List<PostFileItem> PostData { get; set; }public PostAnyWhere(){this.PostData = new List<PostFileItem>();}public void AddText(string key, string value){this.PostData.Add(new PostFileItem { Name = key, Value = value });}public void AddFile(string name, string srcFileName, string desName,string at, string contentType = "text/plain"){string[] srcName = Path.GetFileName(srcFileName).Split('.');string exName = "";if (srcName.Length > 1){exName = "."+srcName[srcName.Length-1];}this.PostUrl = "https://www.xxx.com/test.ashx?guid=" + desName;ReadyFile(name, GetBinaryData(srcFileName), exName,contentType);}void ReadyFile(string name, byte[] fileBytes, string fileExName = "", string contentType = "text/plain"){this.PostData.Add(new PostFileItem{Type = PostFileItemType.File,Name = name,FileBytes = fileBytes,FileName = fileExName,ContentType = contentType});}public string Send(){var boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");var request = (HttpWebRequest)WebRequest.Create(this.PostUrl);request.ContentType = "multipart/form-data; boundary=" + boundary;request.Method = "POST";request.KeepAlive = true;Stream memStream = new System.IO.MemoryStream();var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");var formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";var formFields = this.PostData.Where(m => m.Type == PostFileItemType.Text).ToList();foreach (var d in formFields){var textBytes = System.Text.Encoding.UTF8.GetBytes(string.Format(formdataTemplate, d.Name, d.Value));memStream.Write(textBytes, 0, textBytes.Length);}const string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";var files = this.PostData.Where(m => m.Type == PostFileItemType.File).ToList();foreach (var fe in files){memStream.Write(boundarybytes, 0, boundarybytes.Length);var header = string.Format(headerTemplate, fe.Name, fe.FileName ?? "System.Byte[]", fe.ContentType ?? "text/plain");var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);memStream.Write(headerbytes, 0, headerbytes.Length);memStream.Write(fe.FileBytes, 0, fe.FileBytes.Length);}memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);request.ContentLength = memStream.Length;HttpWebResponse response;try{using (var requestStream = request.GetRequestStream()){memStream.Position = 0;var tempBuffer = new byte[memStream.Length];memStream.Read(tempBuffer, 0, tempBuffer.Length);memStream.Close();requestStream.Write(tempBuffer, 0, tempBuffer.Length);}response = (HttpWebResponse)request.GetResponse();}catch (WebException webException){response = (HttpWebResponse)webException.Response;}if (response == null){throw new Exception("HttpWebResponse is null");}var responseStream = response.GetResponseStream();if (responseStream == null){throw new Exception("ResponseStream is null");}using (var streamReader = new StreamReader(responseStream)){return streamReader.ReadToEnd();}}}public class PostFileItem{public PostFileItem(){this.Type = PostFileItemType.Text;}public PostFileItemType Type { get; set; }public string Value { get; set; }public byte[] FileBytes { get; set; }public string Name { get; set; }public string FileName { get; set; }public string ContentType { get; set; }}public enum PostFileItemType{Text = 0,File = 1}public byte[] GetBinaryData(string filename){if(!File.Exists(filename)){return null;}try{FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);byte[] imageData = new Byte[fs.Length];fs.Read( imageData, 0,Convert.ToInt32(fs.Length));fs.Close();return imageData;}catch(Exception){return null;}finally{}}		

ashx文件部署

?在B服務器上部署ashx文件接收數據,ashx程序即,一般處理程序(HttpHandler),一個httpHandler接受并處理一個http請求,需要實現IHttpHandler接口,這個接口有一個IsReusable成員,一個待實現的方法ProcessRequest(HttpContextctx) 。.ashx程序適合產生供瀏覽器處理的、不需要回發處理的數據格式。

示例代碼如下:

<%@ WebHandler Language="C#" Class="Handler" %>using System;
using System.Web;
using System.IO;public class Handler : IHttpHandler {public void ProcessRequest (HttpContext context) {if (context.Request.Files.Count > 0){string strPath = System.Web.HttpContext.Current.Server.MapPath("~/app_data/test/");string strName = context.Request.Files[0].FileName;string ext=Path.GetExtension(strName);string filename =HttpContext.Current.Request.QueryString["guid"].ToString()+Path.GetFileNameWithoutExtension(strName);if(ext!=""){filename = filename  + ext;}context.Request.Files[0].SaveAs(System.IO.Path.Combine(strPath, filename));}
}public bool IsReusable {get {return false;}
}}

小結?

ashx處理接收的數據后,后續還需要配合實際的接口功能繼續處理應用。另外,對于ashx頁面,實際的應用則需要使用安全訪問控制,只有正常登錄或提供合法訪問令牌的用戶才可以進行訪問。

以上代碼僅供參考,歡迎大家指正,再次感謝您的閱讀!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國汽車電子行業發展現狀分析及投資前景預測報告

全版價格&#xff1a;壹捌零零 報告版本&#xff1a;下單后會更新至最新版本 交貨時間&#xff1a;1-2天 第一章 汽車電子相關概述 1.1 汽車的相關介紹 1.1.1 汽車的概念 我國國家最新標準《汽車和掛車類型的術語和定義》&#xff08;GB/T3730&#xff0e;1—2001&…

基于springboot+vue的貿易行業crm系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Flink分區相關

0、要點 Flink的分區列不會存數據&#xff0c;也就是兩個列有一個分區列&#xff0c;則文件只會存另一個列的數據 1、CreateTable 根據SQL的執行流程&#xff0c;進入TableEnvironmentImpl.executeInternal&#xff0c;createTable分支 } else if (operation instanceof Crea…

Java-nio

一、NIO三大組件 NIO的三大組件分別是Channel&#xff0c;Buffer與Selector Java NIO系統的核心在于&#xff1a;通道(Channel)和緩沖區(Buffer)。通道表示打開到 IO 設備(例如&#xff1a;文件、套接字)的連接。若需要使用 NIO 系統&#xff0c;需要獲取用于連接 IO 設備的通…

Spring的簡單使用及內部實現原理

在現代的Java應用程序開發中&#xff0c;Spring Framework已經成為了不可或缺的工具之一。它提供了一種輕量級的、基于Java的解決方案&#xff0c;用于構建企業級應用程序和服務。本文將介紹Spring的簡單使用方法&#xff0c;并深入探討其內部實現原理。 首先&#xff0c;讓我們…

mysql8.0使用MGR實現高可用

一、三節點MGR集群的安裝部署 1. 安裝準備 準備好下面三臺服務器&#xff1a; IP端口角色192.168.150.213306mgr1192.168.150.223306mgr2192.168.150.233306mgr3 配置hosts解析 # cat >> /etc/hosts << EOF 192.168.150.21 mgr1 192.168.150.22 mgr2 192.168…

Windows環境下的調試器探究——硬件斷點

與軟件斷點與內存斷點不同&#xff0c;硬件斷點不依賴被調試程序&#xff0c;而是依賴于CPU中的調試寄存器。 調試寄存器有7個&#xff0c;分別為Dr0~Dr7。 用戶最多能夠設置4個硬件斷點&#xff0c;這是由于只有Dr0~Dr3用于存儲線性地址。 其中&#xff0c;Dr4和Dr5是保留的…

java中容器繼承體系

首先上圖 源碼解析 打開Collection接口源碼&#xff0c;能夠看到Collection接口是繼承了Iterable接口。 public interface Collection<E> extends Iterable<E> { /** * ...... */ } 以下是Iterable接口源碼及注釋 /** * Implementing this inte…

makefileGDB使用

一、makefile 1、make && makefile makefile帶來的好處就是——自動化編譯&#xff0c;一旦寫好&#xff0c;只需要一個make命令&#xff0c;整個工程完全自動編譯&#xff0c;極大的提高了軟件開發的效率 下面我們通過如下示例來進一步體會它們的作用&#xff1a; ①…

使用 Python 實現一個飛書/微信記賬機器人,酷B了!

Python飛書文檔機器人 今天的主題是&#xff1a;使用Python聯動飛書文檔機器人&#xff0c;實現一個專屬的記賬助手&#xff0c;這篇文章如果對你幫助極大&#xff0c;歡迎你分享給你的朋友、她、他&#xff0c;一起成長。 也歡迎大家留言&#xff0c;說說自己想看什么主題的…

代碼隨想錄第天 78.子集 90.子集II

LeetCode 78 子集 題目描述 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&…

LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目&#xff1a;換根DP(樹形DP) 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 個節點的樹&#xff0c;節點編號為 0 到 n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges…

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…