該博文記錄了一些平時在工做中遇到的問題及解決辦法,某些問題有解決辦法,某些問題暫時沒有解決辦法,若是有大神知道的,請多多指點。html
若是某些問題有更好的解決辦法,也請指教。web
難點:須要實現一個方法,進入參數一個泛型,返回信息一個泛型。可是一個方法中泛型只支持一種類型。數據庫
解決辦法:將進入和返回放在一個類型中,用特性將進入參數和返回參數區分開。編程
難點:微信官網只提供了網頁三方登陸。桌面應用沒有瀏覽器插件。後端
解決辦法:若是要將二維碼顯示在桌面應用端,實現掃碼功能,必須將微信三方網頁登陸整個流程分析清楚,再在服務端模擬微信掃碼功能。跨域
WEB流程:請求微信三方登陸接口;微信端返回一個HTML頁面,內部有二維碼和一個心跳包(輪訓查看掃碼狀況);當掃碼成功,回調請求時給的回調地址。瀏覽器
C/S流程:請求微信三方登陸接口;微信返回一個HTML頁面,將該HTML頁面直接在後端服務代碼中拆解開來,把二維碼信息返回給C/S端,用代碼將心跳包邏輯緩存
寫出來,在服務中實現;當掃碼成功之後,將掃碼信息和客戶微信信息放入緩存中;C/S端經過請求指定API接口獲取掃碼狀況。安全
難點:在Windows服務中沒有不容易模擬GlobalConfiguration全局配置。並且WebApi自己的幫助網頁也不能將返回實體的JSON例子徹底顯示出來服務器
(若是實體是其餘類庫的,就沒法找到);POST請求的形式,沒法顯示具體請求參數信息;返回的不是自定義實體,也沒法顯示返回信息。
解決辦法:模擬WebApi自己的幫助網頁功能,經過讀取程序自己生成的XML文檔+反射實現。
流程:讀取XML文檔,找出各個接口的基礎信息(備註,請求方式,請求域名+地址);在接口代碼註釋中添加自定義註釋(請求參數實體,返回參數實體);
用反射找到具體接口請求和返回信息,再一JSON形式表示出來。
問題:將過大的byte[]一次性轉換成stream並寫入文件,會報內存不足問題。
解決辦法:將一次轉換寫入,編程屢次轉換寫入。
解決辦法:安裝VS補丁,地址是補丁。
相關資料:SQL Server 2012 Auto Identity Column Value Jump Issue
從 SQL Server 2012 版本開始, 當SQL Server 實例重啓以後,表格的自動增加列的值會發生跳躍,而具體的跳躍值的大小是根據增加列的數據類型而定的。若是數據類型是 整型(int),那麼跳躍值爲 1000;若是數據類型爲 長整型(bigint),那麼跳躍值爲 10000。從咱們的項目來看,這種跳躍問題是不能被接受的,尤爲是展現在客戶端的時候。這個奇怪的問題只在 SQL Server 2012 及更高的版本中存在,SQL Server 2012以前版本不存在此問題。
解決方案
1. 使用序列 (Sequence)
首先,咱們須要移除表格的自增列。而後建立一個不帶緩存功能的序列,根據此序列插入數值。
CREATE SEQUENCE Id_Sequence AS INT START WITH 1 INCREMENT BY 1 MINVALUE 0 NO MAXVALUE NO CACHE insert into Table values(NEXT VALUE FOR Id_Sequence, 'xxx');
2. 爲SQL Server 註冊啓動參數 -t272
打開SQL Server配置管理器。 選擇 SQL Server 2012 實例,右鍵, 選擇屬性菜單。在彈出的窗口中找到啓動參數,而後註冊 -t272。 完成以後重啓下圖中的SQL Server(SQLSERVER2012), 以後進行bug重現的操做,驗證問題是否已解決。
問題緣由:js爲了安全性,啓用了同源策略-只能訪問與包含它的文檔或腳本在同一域名下的內容。
解決辦法:在Web.config中的<system.webServer>節點下添加容許跨域訪問的節點,代碼以下:
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> </customHeaders> </httpProtocol>
問題點:在項目中調用一個方法:Function(parOne, Convert.ToInt32(priceStr), parThree);,直接在方法體中用Convert.Int32將1.00強制轉換髮生錯誤。報的錯誤:輸入字符串的格式不正確。這個問題一看就知道是轉化出錯了,可是能夠直接去錯誤點看。可是當Function內部沒法調試,且邏輯很複雜的時候,就不必定直接定位到Function的調用上了(沒幾我的首先去看調用方法的時候出錯沒有)。
解決辦法:先轉換成double,再(int)轉換。其實真真的問題在於編碼不規範。在調用方法時,直接傳遞參數,不在調用時作函數處理。
據我查找資料。C#中不支持MongoDB有同時判斷數據庫中是否含有記錄,再作操做的事務操做功能。
問題點:在查詢是否存在再作操做這兩個操做中用了通常的單列模式(沒有加鎖)。結果在IIS從新編譯後,將編譯期間存到緩存隊列的請求該操做的相同請求一塊兒處理,形成多線程併發,出現多個實例。
解決辦法:在單例中用私有靜態Lock。
if (instance == null) { lock (locker) { //若是類的實例不存在則建立,不然直接返回 if(instance == null) { instance = new singleClass (); } } }
問題點:MongoDB自己爲分佈式開發設計的,自身是沒有帶自增列功能的,C# MongoDB.Driver 也沒有這種功能。
解決辦法:利用MongoDB.Driver中的FindOneAndUpdate+InsertData實現。
實現:
一、先在MongoDB數據庫目標表手動添加一行數據,其中包括特殊行標記字段(tableMark,值爲:"TableMark",其餘非標記數據行,值爲空)和當前表總行數(reg)。
二、實現代碼以下。
問題點:Task.Run(() => });中使用HttpContext失敗。
解決辦法:由於Task.Run另外開啓線程,在主線程中的HttpContext不會被帶入Task.Run中。只有將使用HttpContext的方法放在Task.Run外面,將結果傳入Task.Run中操做。