主頁 > .NET開發 > 基于微信個人收款碼的支付介面的實作與原始碼

基于微信個人收款碼的支付介面的實作與原始碼

2020-09-14 09:19:48 .NET開發

前言 如果我們希望為自己的網站增添微信掃碼收款功能,用于收取一些服務費用,為個人網站提供自動化有償服務的話,那我們有哪些方案呢?

?首先,我們先看下效果,以下是服務端的收款二維碼的發起示例演示:

其次,我們再看看手機端 微信掃碼支付的演示:

我們手機端會將收款的訊息推送到服務器API,其中介面資訊定義大概如下:

{"title":"微信支付","time":"2020-05-08 23:34:11","money":"0.80","deviceid":"mydevice","content":"[2條]微信支付: 微信支付收款0.80元(朋友到店)"} 

以上視頻是讓大家有個效果感觀,下面我們將詳細講解具體實作原理與細節,

 

如果您對本專題有興趣,可以按照下面的思路實作,

同時,您也可以在 文章結尾處 查看獲取原始碼的方法 供用于學習研究用途的 完整原始碼ZIP

原始碼ZIP包括:

一、主原始碼-服務端Api (基于.net core webapi,用于處理支付邏輯)

二、前端基于boostrap的發起二維碼掃碼界面UI

三、Android Apk 原始碼 (java,用于監控手機訊息)

四、apk (編譯完成可用的apk, 如果你不熟悉android,可以直接用這個已經編譯好的apk )

 

API處理原始碼示例如下,

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Lyn.Pay.Api.Domain;
using Lyn.Pay.Api.Utils;
using Lyn.Pay.Api.DAL;

namespace Lyn.Pay.Api.Controllers
{
    /// <summary>
    /// 控制器
    /// </summary>
    [Route("v1/[controller]/[action]")]
    public class PayController : Controller
    {
        //https://github.com/stulzq/snowflake-net
        private static Snowflake.Core.IdWorker worker = new Snowflake.Core.IdWorker(1, 1);

        public PayController()
        {

        }

        #region 業務應用
        [HttpPost]
        [AllowAnonymous]
        public JsonResult QueryAlreadyBuy([FromBody]AddOrderVo vo)
        {
            var remoteUserIp = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
            var userIp = vo.IP.HasValue() ? vo.IP : remoteUserIp;

            //檢查這個IP是否已經購買過此文章了
            var alreadyBuy = Service.QueryAny("SELECT 1 FROM [ORDER]  d WHERE d.TradeProduct = @TradeProduct AND d.IP = @IP AND d.TradeStatus=1 ", new { TradeProduct = vo.ProductName, IP = userIp });
            if (alreadyBuy)
            {
                return Json(Result.Fail(ResultCode.AlreadyBuy));
            }
            else
            {
                return Json(Result.Fail(ResultCode.Fail));
            }
        }

        /// <summary>
        /// 產生新支付訂單
        /// </summary>
        /// <param name="vo">訂單</param>
        /// <returns>串列資料</returns>
        [HttpPost]
        [AllowAnonymous]
        public JsonResult AddOrder([FromBody]AddOrderVo vo)
        {
            var remoteUserIp = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
            var userIp = vo.IP.HasValue() ? vo.IP : remoteUserIp;

            //檢查這個IP是否已經購買過此文章了
            var alreadyBuy = Service.QueryAny("SELECT 1 FROM [ORDER]  d WHERE d.TradeProduct = @TradeProduct AND d.IP = @IP AND d.TradeStatus=1 ", new { TradeProduct = vo.ProductName, IP = userIp });
            if (alreadyBuy)
            {
                return Json(Result.Fail(ResultCode.AlreadyBuy));
            }

            var money = 0;
            var sqlGetValidMoney = @"
                                    SELECT  TOP 1 * FROM Product p WHERE (p.[NAME]=@ProductName  OR p.[NAME]='Gobal') AND  NOT EXISTS(
                                        SELECT 1 FROM [ORDER] d WHERE (d.TradeProduct = p.[NAME] OR p.[NAME]='Gobal') AND d.TradeMoney = p.Money AND d.TradeStatus=0
                                    )  ORDER BY p.IsGobal ASC , p.Money ASC
                                    ";
            var r = new Order();
            //先將過期的更新為過期狀態
            Service.Execute("UPDATE [ORDER] SET TradeStatus=3,ModifyTime=GETDATE() WHERE TradeStatus=0 AND datediff(ss,CreateTime,GETDATE())>120", null);

            var p = Service.QuerySingle<Product>(sqlGetValidMoney, new { ProductName = vo.ProductName });
            if (p != null)
            {

                r.Id = worker.NextId();
                long.TryParse(r.Id.ToString().Substring(1), out long shortid);
                r.Id = shortid;

                r.TradeNo = r.Id.ToString();// vo.TradeNo;
                r.TradeProduct = vo.ProductName;
                r.TradeMoney = p.Money;
                r.TradeStatus = 0;
                r.Remark = remoteUserIp;
                r.IP = userIp;
                r.City = vo.City;
                r.CreateTime = DateTime.Now;
                Service.Execute("INSERT INTO [ORDER](Id,TradeNo,TradeProduct,TradeMoney,Remark,IP,City,TradeStatus,CreateTime)VALUES(@Id,@TradeNo,@TradeProduct,@TradeMoney,@Remark,@IP,@City,@TradeStatus,@CreateTime)"
                    , new { Id = r.Id, TradeNo = r.TradeNo, TradeProduct = r.TradeProduct, TradeMoney = r.TradeMoney, Remark = r.Remark, IP = r.IP, City = r.City, TradeStatus = r.TradeStatus, CreateTime = r.CreateTime });
                money = p.Money;
            }

            if (money > 0)
            {
                return Json(Result.Success(new { TradeNo = r.Id, Money = money , MoneyYuan = money/100.0, PayQRCode = $"/PayQRCode/{money}.jpg" }));
            }
            else
            {
                return Json(Result.Fail(ResultCode.Fail));
            }
        }

        /// <summary>
        /// 產生新支付訂單
        /// </summary>
        /// <param name="vo">訂單</param>
        /// <returns>串列資料</returns>
        [HttpPost]
        [AllowAnonymous]
        public JsonResult DiscardOrder([FromBody]DiscardOrderVo vo)
        {
            //先將過期的更新為過期狀態
            Service.Execute("UPDATE [ORDER] SET TradeStatus=3,ModifyTime=GETDATE() WHERE TradeStatus=0 AND datediff(ss,CreateTime,GETDATE())>120", null);

            var d = Service.QuerySingle<Order>("SELECT * FROM [ORDER] WHERE TradeNo = @TradeNo", new { TradeNo = vo.TradeNo });
            if (d != null && d.TradeStatus == 0)
            {
                Service.Execute("UPDATE [ORDER] SET TradeStatus=2,ModifyTime=GETDATE() WHERE TradeStatus=0 AND  TradeNo = @TradeNo", new { TradeNo = vo.TradeNo });
                return Json(Result.Success());
            }
            return Json(Result.Fail());
        }

        /// <summary>
        /// 查詢訂單
        /// </summary>
        /// <param name="vo">訂單</param>
        /// <returns>串列資料</returns>
        [HttpPost]
        [AllowAnonymous]
        public JsonResult QueryOrder([FromBody]DiscardOrderVo vo)
        {
            var d = Service.QuerySingle<Order>("SELECT * FROM [ORDER] WHERE TradeNo = @TradeNo", new { TradeNo = vo.TradeNo });
            if (d != null && d.TradeStatus == 1)
            {
                return Json(Result.Success());
            }
            return Json(Result.Fail());
        }


        [HttpPost]
        [AllowAnonymous]
        public JsonResult PayNotify([FromBody]PayNotifyVo vo)
        {
            if (vo.title.IndexOf("微信支付")>=0 && vo.money.HasValue())
            {
                //{"title":"微信支付","time":"2019-06-19 21:45:23","money":"0.10","encrypt":"0","deviceid":"ffffffff-c818-83fb-ffff-ffffbbd87511","content":"微信支付收款0.10元(朋友到店)"}
                var moneyFen = Convert.ToInt32(decimal.Parse(vo.money) * 100);
                Service.Execute("UPDATE [ORDER] SET TradeStatus=1,ModifyTime=GETDATE() WHERE TradeStatus=0 AND  TradeMoney = @TradeMoney", new { TradeMoney = moneyFen });
            }
            if (vo.title.IndexOf("微信收款助手")>=0)
            {
                //{ "title":"微信收款助手","time":"2019-06-20 22:24:54","money":"null","deviceid":"ffffffff-c818-83fb-ffff-ffffbbd87511","content":"[店員訊息]收款到賬0.01元"}
                var content = vo.content;
                var money = content.Substring(content.IndexOf("收款到賬"), content.IndexOf("元") - content.IndexOf("收款到賬")).Replace("收款到賬", "");

                var moneyFen = Convert.ToInt32(decimal.Parse(money) * 100);
                Service.Execute("UPDATE [ORDER] SET TradeStatus=1,ModifyTime=GETDATE() WHERE TradeStatus=0 AND  TradeMoney = @TradeMoney", new { TradeMoney = moneyFen });
            }

            return Json(Result.Success());
        }

        #endregion
    }
}

 

下圖是支付回呼的發起與結果的接收示例:

細節原理請仔細往下看.....

 

作為一名程式員,我們或多或少都希望建立自己的個人技術網站、技術博客等等,用于記錄自己的汗水點滴,

同時,如果我們希望為自己的網站增添微信掃碼收款功能,用于收取一些服務費用,為個人網站提供自動化有償服務的話,那我們有哪些方案呢?

 

一、注冊公司,在微信公眾平臺申請支付權限

二、通過微信個人收款碼實作個人收款介面

 

本文我們分析第二種方法,通過微信個人收款碼實作個人收款介面,

這種方法的實作成本非常低,但也只是適用于一些個人網站,小并發量的收款服務,當然了,如果你的網站有大量用戶向你支付,你還不主動去申請注冊公司么,

 

言歸正傳,哪么怎么實作收款介面呢?

首先,我們看一個演示示例: 

可復制鏈接打開體驗 http://letyouknow.net/serverfarm/serverfarm-tutorial3.html

此示例是技術文章內容付費示例,用戶試讀部分后,點擊 展開閱讀更多 并且掃碼支付成功后,展示全部內容,

 

首先,我們需要制作出一套專業的UI,用于展示收款碼

一、當我們點擊展開閱讀更多按鈕后,我們需要顯示一獲取二維碼的示意圖

 

二、根據預設的資費情況,從后臺拉取對應的個人收款二維碼,并設定收款碼有效期,此示例默認2分鐘,

三、設定超時失效機制,引導重新發起支付

 

四、預設個人收款二維碼 

      我們需要將同一個金額照不同的收款備注或不同的金額尾數設定多個,然后保存到服務端,由前端UI的產品拉取對應的金額的二維碼圖片,顯示給用戶

 

五、微信收款通知 回呼服務器API

        我們可以用android apk 用于監控收款通知,并實時回呼我們的服務器,修改用戶訂單的支付狀態,

        我們將apk安裝在手機上后,當有用戶掃碼付款后,我們的微信APP便收到收款通知,同時,我們回呼服務器,

 

 

此方案特性:

這種實作辦法適合小額,支付頻率不高的場景,比如針對 1元這個金額生成了100個有不同收款備注資訊的二維碼,那么也就是說5分鐘內最多只能有100個人同時支付,1分鐘內20個同時支付,對于一些小網站可以滿足需求,

 

此方案的核心是設計思想,另外就是我們如何實時獲取到收款通知,我們用android apk 用于監控收款通知,并實時回呼我們的服務器,修改用戶訂單的支付狀態,有關實時獲取收款通知的實作方法,我們后續將另起一個篇章重點介紹,

 

六、介面定義示例

{"title":"微信支付","time":"2020-05-08 23:34:11","money":"0.80","deviceid":"mydevice","content":"[2條]微信支付: 微信支付收款0.80元(朋友到店)"} 

 

七、api原始碼的說明

       下載原始碼后,用vs2017or2019打開專案,F5運行即可,
  http://localhost:54914/Demo.html

  

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Lyn.Pay.Api.Domain;
using Lyn.Pay.Api.Utils;
using Lyn.Pay.Api.DAL;

namespace Lyn.Pay.Api.Controllers
{
    /// <summary>
    /// 控制器
    /// </summary>
    [Route("v1/[controller]/[action]")]
    public class PayController : Controller
    {
        //https://github.com/stulzq/snowflake-net
        private static Snowflake.Core.IdWorker worker = new Snowflake.Core.IdWorker(1, 1);

        public PayController()
        {

        }

        #region 業務應用
        [HttpPost]
        [AllowAnonymous]
        public JsonResult QueryAlreadyBuy([FromBody]AddOrderVo vo)
        {
            var remoteUserIp = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
            var userIp = vo.IP.HasValue() ? vo.IP : remoteUserIp;

            //檢查這個IP是否已經購買過此文章了
            var alreadyBuy = Service.QueryAny("SELECT 1 FROM [ORDER]  d WHERE d.TradeProduct = @TradeProduct AND d.IP = @IP AND d.TradeStatus=1 ", new { TradeProduct = vo.ProductName, IP = userIp });
            if (alreadyBuy)
            {
                return Json(Result.Fail(ResultCode.AlreadyBuy));
            }
            else
            {
                return Json(Result.Fail(ResultCode.Fail));
            }
        }

        /// <summary>
        /// 產生新支付訂單
        /// </summary>
        /// <param name="vo">訂單</param>
        /// <returns>串列資料</returns>
        [HttpPost]
        [AllowAnonymous]
        public JsonResult AddOrder([FromBody]AddOrderVo vo)
        {
            var remoteUserIp = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
            var userIp = vo.IP.HasValue() ? vo.IP : remoteUserIp;

            //檢查這個IP是否已經購買過此文章了
            var alreadyBuy = Service.QueryAny("SELECT 1 FROM [ORDER]  d WHERE d.TradeProduct = @TradeProduct AND d.IP = @IP AND d.TradeStatus=1 ", new { TradeProduct = vo.ProductName, IP = userIp });
            if (alreadyBuy)
            {
                return Json(Result.Fail(ResultCode.AlreadyBuy));
            }

            var money = 0;
            var sqlGetValidMoney = @"
                                    SELECT  TOP 1 * FROM Product p WHERE (p.[NAME]=@ProductName  OR p.[NAME]='Gobal') AND  NOT EXISTS(
                                        SELECT 1 FROM [ORDER] d WHERE (d.TradeProduct = p.[NAME] OR p.[NAME]='Gobal') AND d.TradeMoney = p.Money AND d.TradeStatus=0
                                    )  ORDER BY p.IsGobal ASC , p.Money ASC
                                    ";
            var r = new Order();
            //先將過期的更新為過期狀態
            Service.Execute("UPDATE [ORDER] SET TradeStatus=3,ModifyTime=GETDATE() WHERE TradeStatus=0 AND datediff(ss,CreateTime,GETDATE())>120", null);

            var p = Service.QuerySingle<Product>(sqlGetValidMoney, new { ProductName = vo.ProductName });
            if (p != null)
            {

                r.Id = worker.NextId();
                long.TryParse(r.Id.ToString().Substring(1), out long shortid);
                r.Id = shortid;

                r.TradeNo = r.Id.ToString();// vo.TradeNo;
                r.TradeProduct = vo.ProductName;
                r.TradeMoney = p.Money;
                r.TradeStatus = 0;
                r.Remark = remoteUserIp;
                r.IP = userIp;
                r.City = vo.City;
                r.CreateTime = DateTime.Now;
                Service.Execute("INSERT INTO [ORDER](Id,TradeNo,TradeProduct,TradeMoney,Remark,IP,City,TradeStatus,CreateTime)VALUES(@Id,@TradeNo,@TradeProduct,@TradeMoney,@Remark,@IP,@City,@TradeStatus,@CreateTime)"
                    , new { Id = r.Id, TradeNo = r.TradeNo, TradeProduct = r.TradeProduct, TradeMoney = r.TradeMoney, Remark = r.Remark, IP = r.IP, City = r.City, TradeStatus = r.TradeStatus, CreateTime = r.CreateTime });
                money = p.Money;
            }

            if (money > 0)
            {
                return Json(Result.Success(new { TradeNo = r.Id, Money = money , MoneyYuan = money/100.0, PayQRCode = $"/PayQRCode/{money}.jpg" }));
            }
            else
            {
                return Json(Result.Fail(ResultCode.Fail));
            }
        }

        /// <summary>
        /// 產生新支付訂單
        /// </summary>
        /// <param name="vo">訂單</param>
        /// <returns>串列資料</returns>
        [HttpPost]
        [AllowAnonymous]
        public JsonResult DiscardOrder([FromBody]DiscardOrderVo vo)
        {
            //先將過期的更新為過期狀態
            Service.Execute("UPDATE [ORDER] SET TradeStatus=3,ModifyTime=GETDATE() WHERE TradeStatus=0 AND datediff(ss,CreateTime,GETDATE())>120", null);

            var d = Service.QuerySingle<Order>("SELECT * FROM [ORDER] WHERE TradeNo = @TradeNo", new { TradeNo = vo.TradeNo });
            if (d != null && d.TradeStatus == 0)
            {
                Service.Execute("UPDATE [ORDER] SET TradeStatus=2,ModifyTime=GETDATE() WHERE TradeStatus=0 AND  TradeNo = @TradeNo", new { TradeNo = vo.TradeNo });
                return Json(Result.Success());
            }
            return Json(Result.Fail());
        }

        /// <summary>
        /// 查詢訂單
        /// </summary>
        /// <param name="vo">訂單</param>
        /// <returns>串列資料</returns>
        [HttpPost]
        [AllowAnonymous]
        public JsonResult QueryOrder([FromBody]DiscardOrderVo vo)
        {
            var d = Service.QuerySingle<Order>("SELECT * FROM [ORDER] WHERE TradeNo = @TradeNo", new { TradeNo = vo.TradeNo });
            if (d != null && d.TradeStatus == 1)
            {
                return Json(Result.Success());
            }
            return Json(Result.Fail());
        }


        [HttpPost]
        [AllowAnonymous]
        public JsonResult PayNotify([FromBody]PayNotifyVo vo)
        {
            if (vo.title.IndexOf("微信支付")>=0 && vo.money.HasValue())
            {
                //{"title":"微信支付","time":"2019-06-19 21:45:23","money":"0.10","encrypt":"0","deviceid":"ffffffff-c818-83fb-ffff-ffffbbd87511","content":"微信支付收款0.10元(朋友到店)"}
                var moneyFen = Convert.ToInt32(decimal.Parse(vo.money) * 100);
                Service.Execute("UPDATE [ORDER] SET TradeStatus=1,ModifyTime=GETDATE() WHERE TradeStatus=0 AND  TradeMoney = @TradeMoney", new { TradeMoney = moneyFen });
            }
            if (vo.title.IndexOf("微信收款助手")>=0)
            {
                //{ "title":"微信收款助手","time":"2019-06-20 22:24:54","money":"null","deviceid":"ffffffff-c818-83fb-ffff-ffffbbd87511","content":"[店員訊息]收款到賬0.01元"}
                var content = vo.content;
                var money = content.Substring(content.IndexOf("收款到賬"), content.IndexOf("元") - content.IndexOf("收款到賬")).Replace("收款到賬", "");

                var moneyFen = Convert.ToInt32(decimal.Parse(money) * 100);
                Service.Execute("UPDATE [ORDER] SET TradeStatus=1,ModifyTime=GETDATE() WHERE TradeStatus=0 AND  TradeMoney = @TradeMoney", new { TradeMoney = moneyFen });
            }

            return Json(Result.Success());
        }

        #endregion
    }
}

  

八、原始碼ZIP僅供用于學習與研究用途

一、主原始碼-服務端Api (基于.net core webapi,用于處理支付邏輯)

二、前端基于boostrap的發起二維碼掃碼界面UI

三、Android Apk 原始碼 (java,用于監控手機訊息)

四、apk (編譯完成可用的apk, 如果你不熟悉android,可以直接用這個已經編譯好的apk )

 

九、如何獲取原始碼?

      掃碼關注的dotNet框架學苑公眾號,直接在公眾號文章中付費閱讀對應的文章,文章尾部有原始碼壓縮包, 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/33234.html

標籤:.NET Core

上一篇:docker部署netcore專案 nginx負載均衡

下一篇:Jenkins之Nunit的應用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more