最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)Post數(shù)據(jù)或文件到指定的服務(wù)器進(jìn)行接收

 更新時間:2024年03月01日 11:10:36   作者:初九之潛龍勿用  
這篇文章主要為大家詳細(xì)介紹了如何通過C#實(shí)現(xiàn)Post數(shù)據(jù)或文件到指定的服務(wù)器進(jìn)行接收,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下

應(yīng)用場景

不同的接口服務(wù)器處理不同的應(yīng)用,我們會在實(shí)際應(yīng)用中將A服務(wù)器的數(shù)據(jù)提交給B服務(wù)器進(jìn)行數(shù)據(jù)接收并處理業(yè)務(wù)。

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

實(shí)現(xiàn)原理

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

實(shí)現(xiàn)代碼

PostAnyWhere類

創(chuàng)建一個 PostAnyWhere 類,

該類具有如下屬性:

(1)public string PostUrl     要提交的服務(wù)器URL

(2)public List<PostFileItem> PostData   要準(zhǔn)備的數(shù)據(jù)(PostFileItem類可包括數(shù)據(jù)和文件類型)

該類包含的關(guān)鍵方法如下:

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

該方法將指定的字典數(shù)據(jù)加入到PostData中

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

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

(3)public string Send() 

該方法將開始POST傳送數(shù)據(jù)

代碼如下:

    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服務(wù)器上部署ashx文件接收數(shù)據(jù),ashx程序即,一般處理程序(HttpHandler),一個httpHandler接受并處理一個http請求,需要實(shí)現(xiàn)IHttpHandler接口,這個接口有一個IsReusable成員,一個待實(shí)現(xiàn)的方法ProcessRequest(HttpContextctx) 。.ashx程序適合產(chǎn)生供瀏覽器處理的、不需要回發(fā)處理的數(shù)據(jù)格式。

示例代碼如下:

<%@ 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;
   }
}
 
}

小結(jié) 

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

到此這篇關(guān)于C#實(shí)現(xiàn)Post數(shù)據(jù)或文件到指定的服務(wù)器進(jìn)行接收的文章就介紹到這了,更多相關(guān)C# Post數(shù)據(jù)或文件到指定服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Winform窗體傳值的方法(示例)

    Winform窗體傳值的方法(示例)

    C#開發(fā)windows應(yīng)用程序項(xiàng)目時,不同窗口之間傳值有很多中方法,在此給大家介紹兩種比較常用的winform窗體傳值的方法,有需要的朋友可以參考下
    2015-08-08
  • Unity3D開發(fā)實(shí)戰(zhàn)之五子棋游戲

    Unity3D開發(fā)實(shí)戰(zhàn)之五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Unity3D開發(fā)實(shí)戰(zhàn)之五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C# 獲取系統(tǒng)字體的示例代碼

    C# 獲取系統(tǒng)字體的示例代碼

    這篇文章主要介紹了C# 獲取系統(tǒng)字體的方法,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 解析使用enumerator模式簡化異步操作的詳解

    解析使用enumerator模式簡化異步操作的詳解

    本篇文章是對使用enumerator模式簡化異步操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Unity3D更改默認(rèn)的腳本編輯器

    Unity3D更改默認(rèn)的腳本編輯器

    這篇文章簡要的說明了如何去修改Unity默認(rèn)的腳本編輯器,大大提升了靈活性和便捷性,文本有詳細(xì)的圖文介紹,能讓你觀看的更加清晰,希望對你有所幫助
    2021-06-06
  • C#中GraphicsPath的Widen方法用法實(shí)例

    C#中GraphicsPath的Widen方法用法實(shí)例

    這篇文章主要介紹了C#中GraphicsPath的Widen方法用法,實(shí)例分析了Widen方法的使用技巧,需要的朋友可以參考下
    2015-06-06
  • C# 導(dǎo)出Excel的6種簡單方法實(shí)現(xiàn)

    C# 導(dǎo)出Excel的6種簡單方法實(shí)現(xiàn)

    C# 導(dǎo)出 Excel 的6種簡單方法:數(shù)據(jù)表導(dǎo)出到 Excel,對象集合導(dǎo)出到 Excel,數(shù)據(jù)庫導(dǎo)出到 Excel,微軟網(wǎng)格控件導(dǎo)出到 Excel,數(shù)組導(dǎo)出到 Excel,CSV 導(dǎo)出到 Excel,你都會了嗎?需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • C#通過域名獲得IP地址的方法

    C#通過域名獲得IP地址的方法

    這篇文章主要介紹了C#通過域名獲得IP地址的方法,涉及C#中GetHostByName方法的使用技巧,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)OpenOffice(ODT/ODS/ODP)到Microsoft Office(DOCX/XLSX/PPTX)的完整轉(zhuǎn)換

    C#實(shí)現(xiàn)OpenOffice(ODT/ODS/ODP)到Microsoft Office(DOCX/XLSX/

    在當(dāng)今數(shù)字化辦公環(huán)境中,文檔格式的兼容性問題常常給開發(fā)者和終端用戶帶來困擾,本文將介紹如何使用C#高效實(shí)現(xiàn)將ODT、ODS和ODP文件轉(zhuǎn)換為對應(yīng)的DOCX、XLSX和PPTX格式,需要的可以了解下
    2026-02-02
  • c#隊(duì)列Queue學(xué)習(xí)示例分享

    c#隊(duì)列Queue學(xué)習(xí)示例分享

    隊(duì)列Queue,先進(jìn)先出,先生產(chǎn)的貨物先出貨,后生產(chǎn)的貨物后出貨,下面看示例學(xué)習(xí)c#隊(duì)列Queue
    2013-12-12

最新評論

左贡县| 曲水县| 海阳市| 裕民县| 隆尧县| 横山县| 阜新| 黑龙江省| 纳雍县| 杭锦旗| 略阳县| 纳雍县| 河北省| 罗甸县| 江山市| 金沙县| 新干县| 澜沧| 松潘县| 铜山县| 阿瓦提县| 宁南县| 高尔夫| 莱州市| 贺州市| 西峡县| 凤庆县| 雷波县| 郧西县| 安溪县| 夏津县| 鸡西市| 漠河县| 平凉市| 西乌| 健康| 垫江县| 广南县| 荣成市| 东阿县| 镇康县|