項目中遇到的某些問題及解決辦法(一)

簡介

    該博文記錄了一些平時在工做中遇到的問題及解決辦法,某些問題有解決辦法,某些問題暫時沒有解決辦法,若是有大神知道的,請多多指點。html

若是某些問題有更好的解決辦法,也請指教。web

知識點

一、在一個方法中用泛型操做兩個不一樣的類型(Type)。

     難點:須要實現一個方法,進入參數一個泛型,返回信息一個泛型。可是一個方法中泛型只支持一種類型。數據庫

     解決辦法:將進入和返回放在一個類型中,用特性將進入參數和返回參數區分開。編程

 

二、微信三方登陸,須要在PC桌面應用端+API服務實現。

     難點:微信官網只提供了網頁三方登陸。桌面應用沒有瀏覽器插件。後端

     解決辦法:若是要將二維碼顯示在桌面應用端,實現掃碼功能,必須將微信三方網頁登陸整個流程分析清楚,再在服務端模擬微信掃碼功能。跨域

     WEB流程:請求微信三方登陸接口;微信端返回一個HTML頁面,內部有二維碼和一個心跳包(輪訓查看掃碼狀況);當掃碼成功,回調請求時給的回調地址。瀏覽器

     C/S流程:請求微信三方登陸接口;微信返回一個HTML頁面,將該HTML頁面直接在後端服務代碼中拆解開來,把二維碼信息返回給C/S端,用代碼將心跳包邏輯緩存

寫出來,在服務中實現;當掃碼成功之後,將掃碼信息和客戶微信信息放入緩存中;C/S端經過請求指定API接口獲取掃碼狀況。安全

 

三、以Windows服務形式的WebApi服務實現相似於寄宿IIS的WebApi服務接口幫助網頁。

     難點:在Windows服務中沒有不容易模擬GlobalConfiguration全局配置。並且WebApi自己的幫助網頁也不能將返回實體的JSON例子徹底顯示出來服務器

(若是實體是其餘類庫的,就沒法找到);POST請求的形式,沒法顯示具體請求參數信息;返回的不是自定義實體,也沒法顯示返回信息。

    解決辦法:模擬WebApi自己的幫助網頁功能,經過讀取程序自己生成的XML文檔+反射實現。

    流程:讀取XML文檔,找出各個接口的基礎信息(備註,請求方式,請求域名+地址);在接口代碼註釋中添加自定義註釋(請求參數實體,返回參數實體);

用反射找到具體接口請求和返回信息,再一JSON形式表示出來。

 

四、byte[]轉換成stream出現內存不足問題。

   問題:將過大的byte[]一次性轉換成stream並寫入文件,會報內存不足問題。

      解決辦法:將一次轉換寫入,編程屢次轉換寫入。

 

五、vs2012打開項目,運行時,提示ASP.net4.5未在web服務器上註冊

      解決辦法:安裝VS補丁,地址是補丁

 

六、SQL Server 2012 自動增加列,值跳躍問題

   相關資料: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)

        首先,咱們須要移除表格的自增列。而後建立一個不帶緩存功能的序列,根據此序列插入數值。

  1. 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重現的操做,驗證問題是否已解決。

          

 

七、jQuery+Ajax沒法實現跨域操做

     問題緣由:js爲了安全性,啓用了同源策略-只能訪問與包含它的文檔或腳本在同一域名下的內容。

     解決辦法:在Web.config中的<system.webServer>節點下添加容許跨域訪問的節點,代碼以下:

  1.     <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>

八、調用方法體中用了函數(強制轉換成Int32)-編碼不規範問題。

      問題點:在項目中調用一個方法:Function(parOne, Convert.ToInt32(priceStr), parThree);,直接在方法體中用Convert.Int32將1.00強制轉換髮生錯誤。報的錯誤:輸入字符串的格式不正確。這個問題一看就知道是轉化出錯了,可是能夠直接去錯誤點看。可是當Function內部沒法調試,且邏輯很複雜的時候,就不必定直接定位到Function的調用上了(沒幾我的首先去看調用方法的時候出錯沒有)。

      解決辦法:先轉換成double,再(int)轉換。其實真真的問題在於編碼不規範。在調用方法時,直接傳遞參數,不在調用時作函數處理。

 

九、C#操做MongoDB重複插入數據問題。

    據我查找資料。C#中不支持MongoDB有同時判斷數據庫中是否含有記錄,再作操做的事務操做功能。

     問題點:在查詢是否存在再作操做這兩個操做中用了通常的單列模式(沒有加鎖)。結果在IIS從新編譯後,將編譯期間存到緩存隊列的請求該操做的相同請求一塊兒處理,形成多線程併發,出現多個實例。

     解決辦法:在單例中用私有靜態Lock。

  1. if (instance == null)
    {
        lock (locker)
         {
            //若是類的實例不存在則建立,不然直接返回
             if(instance == null)
              {
                 instance = new singleClass  ();
              }
        }
    }

十、C#操做MongoDB增長自增列。

     問題點:MongoDB自己爲分佈式開發設計的,自身是沒有帶自增列功能的,C# MongoDB.Driver 也沒有這種功能。

     解決辦法:利用MongoDB.Driver中的FindOneAndUpdate+InsertData實現。

     實現:

     一、先在MongoDB數據庫目標表手動添加一行數據,其中包括特殊行標記字段(tableMark,值爲:"TableMark",其餘非標記數據行,值爲空)和當前表總行數(reg)。

     

     二、實現代碼以下。

     

      

十一、 Task.Run(() => });中使用HttpContext失敗。

     問題點:Task.Run(() => });中使用HttpContext失敗。

     解決辦法:由於Task.Run另外開啓線程,在主線程中的HttpContext不會被帶入Task.Run中。只有將使用HttpContext的方法放在Task.Run外面,將結果傳入Task.Run中操做。

相關文章
相關標籤/搜索