EF+LINQ事物處理 C# 使用NLog記錄日誌入門操做 ASP.NET MVC多語言 仿微軟網站效果(轉) 詳解C#特性和反射(一) c# API接受圖片文件以Base64格式上傳圖片 .NET讀

EF+LINQ事物處理

 

在使用EF的狀況下,怎麼進行事務的處理,來減小數據操做時的失誤,好比重複插入數據等等這些問題,這都是常常會遇到的一些問題html

可是若是是我有多個站點,而後存在同類型的角色去操做同一條數據的同一個字段的話,那就須要對數據庫進行操做,這是數據庫裏面的事務了git

這個另外再說。github

這裏有這麼一個很好的解決方式,EF6裏面提供了這麼一個方式來處理事物web

Database.BeginTransaction() : 爲用戶提供一種簡單易用的方案,在dbEntitys數據庫

中啓動並完成一個事務 -- 合併一系列操做到該事務中。同時使用戶更方便的指定事務隔離級別。express

Database.UseTransaction() : 容許DbContext使用一個EF框架外的事務。json

複製代碼
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Transactions; 
 
namespace TransactionsExamples 
{ 
    class TransactionsExample 
    { 
        static void StartOwnTransactionWithinContext() 
        { 
            using (var db= new dbEntitys()) 
            { 
                using (var dbContextTransaction = db.Database.BeginTransaction()) 
                { 
                    try 
                    { 
                    var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
                        foreach (var post in query) 
                        { 
                            post.Title += "[Cool Blog]"; 
                        } 
 
                        context.SaveChanges(); 
 
                        dbContextTransaction.Commit(); 
                    } 
                    catch (Exception) 
                    { 
                        dbContextTransaction.Rollback(); 
                    } 
                } 
            } 
        } 
    } 
}
複製代碼

 

C# 使用NLog記錄日誌入門操做

 

 環境:win7 64位, VS2010c#

一、首先用VS2010建立命令行工程NLogDemo瀏覽器

二、在程序包管理器控制檯中輸入:Install-Package NLog -Version 4.4.12cookie

  這句是怎麼來的,要是你用過nuget包管理工具,那就能夠跳過這裏的說明了。

  要使用nuget添加NLog包到項目中。請看下圖。

 

而後在程序包管理工具控制檯下輸入:Install-Package NLog -Version 4.4.12

再看看Install-Package NLog -Version 4.4.12這個怎麼找。

打開百度搜索:Nuget

而後在Nuget官網上搜索欄輸入:Nlog 回車

選擇第一項Nlog

 

而後在 Version History 下選擇 4.4.12 這個版本

 

至於爲何選擇這個版本,由於這個版本下載的次數多。嘿嘿,沒辦法,隨大流。固然還要看這個版本包的依賴項

這個包的沒有什麼特殊依賴項,因此可使用。而後拷貝

 

 

 這裏這句話就是要咱們要找的。是否是挺簡單的。

當咱們在包程序包管理器控制檯中輸入:Install-Package NLog -Version 4.4.12 而後按下回車鍵,VS IDE 會自動到 nuget.org 這裏下載依賴包。

NLog 包添加完以後,還要添加 NLog.config(4.4.12)(Install-Package NLog.Config -Version 4.4.12) 這個包,按道理 NLog 和 NLog.config 應該一塊兒的,

忽然從某個版本開始分開了,要單獨添加。具體狀況能夠去官網看介紹:https://nlog-project.org/

 

添加 NLog.config 的方法跟上面添加 NLog 的方法同樣。

三、簡單封裝 Log

  添加類Log.cs到工程中,修改代碼以下:

複製代碼
public sealed class Log
{
    private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();

    private Log() { }

    public static void Trace(string strMsg)
    {
        _logger.Trace(strMsg);
    }

    public static void Debug(string strMsg)
    {
        _logger.Debug(strMsg);
    }

    public static void Info(string strMsg)
    {
        _logger.Info(strMsg);
    }

    public static void Warn(string strMsg)
    {
        _logger.Warn(strMsg);
    }

    public static void Error(string strMsg)
    {
        _logger.Error(strMsg);
    }

    public static void Fatal(string strMsg)
    {
        _logger.Fatal(strMsg);
    }

}
複製代碼

四、修改NLog.config文件,具體內容以下:

複製代碼
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
    <!--
  <variable name="myvar" value="myvalue"/>
    -->
    <variable name="fileFormat"
            value="
            ${newline}date:${date}
            ${newline}level:${level}
            ${newline}logger:${logger}
            ${newline}machinename:${machinename}
            ${newline}message:${message}
            ${newline}appdomain:${appdomain}
            ${newline}assembly-version:${assembly-version}
            ${newline}basedir:${basedir}
            ${newline}callsite:${callsite}
            ${newline}counter:${counter}
            ${newline}nlogdir:${nlogdir}
            ${newline}processid:${processid}
            ${newline}processname:${processname}
            ${newline}specialfolder:${specialfolder}
            ${newline}stacktrace: ${stacktrace}
            ${newline}------------------------------------------------------------" />

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>

    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->

      <target name="file" xsi:type="File"
            fileName="${basedir}/Logs/${date:format=yyyy-MM}/${shortdate}.log"
            layout="${fileFormat}"
            maxArchiveFiles="5"
            archiveAboveSize="10240"
            archiveEvery="Day"/>
      
  </targets>

  <rules>
    <!-- add your logging rules here -->

    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->

    <!--
        Level    Example
        Fatal    Highest level: important stuff down
        Error    For example application crashes / exceptions.
        Warn    Incorrect behavior but the application can continue
        Info    Normal behavior like mail sent, user updated profile etc.
        Debug    Executed queries, user authenticated, session expired
        Trace    Begin method X, end method X etc
    -->
    <!--
        Logging 水平分爲如下等級「Trace<<Debug<<Info<<Warn<<Error<<Fatal 」,若是咱們選擇Info值,則Trace和Debug等級的信息不會被輸出。
    -->
     <logger name="*" minlevel="Trace" writeTo="file"/>
  </rules>
</nlog>
複製代碼

簡單解釋:

variable  log文件的內容輸出格式
targets 目標文件(要生成的Log文件)的配置(文件名、格式變量、文件個數、文件大小等等)
rules 規則,也就是俗話說的Log輸出級別

以上內容不進行過多解釋了,再多解釋也不如官網的說明。詳細介紹請看官網:https://github.com/nlog/NLog/wiki/Configuration-file#configuration-file-format

五、使用Log輸出日誌到文件,簡單示例代碼以下

複製代碼
class Program
{
    static void Main(string[] args)
    {
        RunTest();
        
        Console.WriteLine("Press a key end ...");
        Console.ReadKey(true);
    }

    static void RunTest()
    {
        for (int i = 0; i < 1000; i++)
        {
            Log.Info(string.Format("{0}", i + 1));

            System.Threading.Thread.Sleep(10);
        }
    }

}
複製代碼

輸出路徑結構

輸出文件內容:

以上內容輸出格式能夠在NLog.config中根據需求進行裁剪。

demo下載

 

 

 

 

ASP.NET MVC多語言 仿微軟網站效果(轉)

本文轉自: https://blog.csdn.net/Cooldiok/article/details/7831351

2017年10月22日 21:31:22 

微軟做爲ASP.NET的創造者,它對於官網的結構設計確定有值得咱們借鑑和參考的地方

本項目是基於VS2017 pro開發的,將從你已經建立了一個MVC項目開始介紹: 
流程圖 
這裏寫圖片描述

1.建立語言文件 
建立App_GlobalResources文件夾 
這裏寫圖片描述

建立Language文件夾 
這裏寫圖片描述

建立資源文件 
這裏寫圖片描述

這些操做作完後,目錄結構應該是如下這樣的 
這裏寫圖片描述

咱們打開每一個資源文件,在裏面添加一條TiTle數據 
這裏寫圖片描述

我推薦使用ResX Manager來管理語言文件 
好比我已經建立了中文、英語、日語這三個語言文件,我若是要作修改的話就須要每一個文件輪流修改,使用ResX Manager就能直接同時修改這三個語言文件,它還提供語言翻譯功能。具體使用方法與此文無關,就再也不贅述了。 
這裏寫圖片描述

2.建立一個過濾器 
這裏寫圖片描述

複製代碼
 1 namespace MvcEdu.Filters
 2 {
 3     public class LocalizationAttribute : ActionFilterAttribute
 4     {
 5         public override void OnActionExecuting(ActionExecutingContext filterContext)
 6         {
 7 
 8             bool isSkipLocalization = filterContext.ActionDescriptor.IsDefined(typeof(WithoutLocalizationAttribute), inherit: true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(WithoutLocalizationAttribute), inherit: true);
 9 
10             if (!isSkipLocalization)
11             {
12                 if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
13                 {
14                     ///從路由數據(url)裏設置語言
15                     var lang = filterContext.RouteData.Values["lang"].ToString();
16                     Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
17                 }
18                 else
19                 {
20                     ///從cookie裏讀取語言設置
21                     var cookie = filterContext.HttpContext.Request.Cookies["Localization.CurrentUICulture"];
22                     var langHeader = string.Empty;
23                     if (cookie != null && cookie.Value != "")
24                     {
25                         ///根據cookie設置語言
26                         langHeader = cookie.Value;
27                         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
28                     }
29                     else
30                     {
31                         ///若是讀取cookie失敗則設置默認語言
32                         langHeader = filterContext.HttpContext.Request.UserLanguages[0];
33                         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
34                     }
35                     ///把語言值設置到路由值裏
36                     filterContext.RouteData.Values["lang"] = langHeader;
37                     //若是url中不包含語言設置則重定向到包含語言值設置的url裏
38                     string ReturnUrl = $"/{filterContext.RouteData.Values["lang"]}/{filterContext.RouteData.Values["controller"]}/{filterContext.RouteData.Values["action"]}";
39                     filterContext.Result = new RedirectResult(ReturnUrl);
40                 }
41 
42                 /// 把設置保存進cookie
43                 HttpCookie _cookie = new HttpCookie("Localization.CurrentUICulture", Thread.CurrentThread.CurrentUICulture.Name);
44                 _cookie.Expires = DateTime.Now.AddYears(1);
45                 filterContext.HttpContext.Response.SetCookie(_cookie);
46 
47                 base.OnActionExecuting(filterContext);
48             }
49 
50         }
51     }
52 
53     public class WithoutLocalizationAttribute : Attribute
54     {
55     }
56 }
複製代碼

 

3.配置路由文件 
我這邊由於只有三個語言文件,因此我對於語言項的輸入作了限制。

複製代碼
 1 namespace MvcEdu
 2 {
 3     public class RouteConfig
 4     {
 5         public static void RegisterRoutes(RouteCollection routes)
 6         {
 7             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 8 
 9             routes.MapRoute(
10               name: "Localization", // 路由名稱
11               url: "{lang}/{controller}/{action}/{id}", // 帶有參數的 URL\
12               constraints: new { lang = "zh-CN|en-US|ja-JP" }, //限制可輸入的語言項
13               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }//參數默認值
14             );
15 
16             routes.MapRoute(
17                 name: "Default",
18                 url: "{controller}/{action}/{id}",
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
20             );
21         }
22     }
23 }
複製代碼

 

4.修改HomeController.cs文件,添加修改語言函數

複製代碼
 1 namespace MvcEdu.Controllers
 2 {
 3     [Localization] //HomeController裏的函數都要走Localization過濾器
 4     public class HomeController : Controller
 5     {
 6         public ActionResult Index()
 7         {
 8             ViewBag.Title = Resources.Language.Title;//頁面中的Title值取語言文件裏的Title值
 9             return View();
10         }
11 
12         public ActionResult About()
13         {
14             ViewBag.Title = Resources.Language.Title;//頁面中的Title值取語言文件裏的Title值
15             ViewBag.Message = "Your application description page.";
16 
17             return View();
18         }
19 
20         public ActionResult Contact()
21         {
22             ViewBag.Title = Resources.Language.Title;//頁面中的Title值取語言文件裏的Title值
23             ViewBag.Message = "Your contact page.";
24 
25             return View();
26         }
27         [WithoutLocalization]//這個函數不走Localization過濾器
28         public ActionResult ChangeLanguage(String NewLang, String ReturnUrl)
29         {
30             if (!ReturnUrl.EndsWith("/"))
31             {
32                 ReturnUrl += "/";
33             }
34             //use NewLang replace old lang,include input judgment
35             if (!string.IsNullOrEmpty(ReturnUrl) && ReturnUrl.Length > 3 && ReturnUrl.StartsWith("/") && ReturnUrl.IndexOf("/", 1) > 0 && new string[] { "zh-CN", "en-US","ja-JP" }.Contains(ReturnUrl.Substring(1, ReturnUrl.IndexOf("/", 1) - 1)))
36             {
37                 ReturnUrl = $"/{NewLang}{ReturnUrl.Substring(ReturnUrl.IndexOf("/", 1))}";
38             }
39             else
40             {
41                 ReturnUrl = $"/{NewLang}{ReturnUrl}";
42             }
43             return Redirect(ReturnUrl);//redirect to new url
44         }
45     }
46 }
複製代碼

 

注意:我在使用vs2015 express for web時,出現了使用Resources.Language時智能提示沒出現Title的狀況,此時去找一下Language.designer.cs裏有無如下代碼,若是沒有的話則之後添加鍵值對的時候大家都要在此手動添加,或者把Language文件夾建在Controllers的同級目錄下而後再新建資源文件等操做也能解決該問題。

複製代碼
1 /// <summary>
2         ///  查找相似 標題 的本地化字符串。
3         /// </summary>
4         internal static string Title {
5             get {
6                 return ResourceManager.GetString("Title", resourceCulture);
7             }
8         }
複製代碼

 

5.修改母版頁,添加了修改語言的link

複製代碼
 1 <div class="navbar-collapse collapse">
 2                 <ul class="nav navbar-nav">
 3                     <li>@Html.ActionLink("主頁", "Index", "Home")</li>
 4                     <li>@Html.ActionLink("關於", "About", "Home")</li>
 5                     <li>@Html.ActionLink("聯繫方式", "Contact", "Home")</li>
 6                     @*如下是添加的內容*@
 7                     <li>@Html.ActionLink("en-US", "ChangeLanguage", "Home",new { NewLang = "en-US",ReturnUrl=Request.RawUrl},new { @class="testclass"})</li>
 8                     <li>@Html.ActionLink("zh-CN", "ChangeLanguage", "Home", new { NewLang = "zh-CN", ReturnUrl = Request.RawUrl }, new { @class = "testclass" })</li>
 9                     <li>@Html.ActionLink("ja-JP", "ChangeLanguage", "Home", new { NewLang = "ja-JP", ReturnUrl = Request.RawUrl }, new { @class = "testclass" })</li>
10                 </ul>
11             </div>
複製代碼

 

6.Views/Home的三個頁面我都加了顯示ViewBag.Title值的代碼

1 <h2>@ViewBag.Title.</h2>

 

7.如今咱們來運行,看一下效果 
首次登陸的時候由於url是localhost:50062/,沒有語言項,因此讀取瀏覽器默認語言「zh-CN」,而後重定向。 
這裏寫圖片描述

如下是點擊導航欄的en-US和ja-JP時的狀況 
這裏寫圖片描述

這裏寫圖片描述

8.若是用戶直接輸入http://localhost:50062/Home/Index/ 
程序會重定向到http://localhost:50062/cookie裏保存的語言項OR瀏覽器默認語言/Home/Index/

基本作到了和MSDN效果同樣。

本文Demo下載:

本文參考了:

http://www.cnblogs.com/zoro-zero/p/6674442.html 
http://www.cnblogs.com/CameronWu/p/5709442.html

 
 
標籤:  代碼收藏系列
 
 
 
 

詳解C#特性和反射(一)

 

  使用特性(Attribute)能夠將描述程序集的信息和描述程序集中任何類型和成員的信息添加到程序集的元數據和IL代碼中,程序能夠在運行時經過反射獲取到這些信息;

 

  1、經過直接或間接的繼承自抽象類System.Attribute能夠建立自定義的特性類,自定義的特性類必須聲明爲公共類,命名通常使用Attribute結尾以保證可讀性,自定義特性能夠附加到大多數元素聲明中,也可使用特性System.AttributeUsage(該特性只能用於特性類聲明)指定該特性所能生效的範圍及其它特性特徵參數:

複製代碼
[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)]
//其中,枚舉組合AttributeTargets指定該特性生效的範圍,默認爲All即全部範圍;
//布爾值Inherited指定應用該特性的成員在派生類中是否會繼承該特性,默認爲true;
//布爾值AllowMultiple指定可否爲同一個元素指定多個此特性,默認爲false public class MyselfAttribute : Attribute { public string ClassName { get; private set; } public string Author; public MyselfAttribute(string className) { this.className = className; } }
複製代碼

  其中特性類的構造函數中的參數稱爲位置參數(Positional Parameters),類中的其餘公共字段和屬性稱爲命名參數(Named Parameter), 一般狀況下,將全部必選的參數定義爲位置參數,將全部可選的參數定義爲命名參數;特性類和普通類同樣能夠進行構造函數的重載以適應各類狀況下初始化參數的組合使用;

 

  2、使用特性時,經過方括號[]將特性名稱括起來,並置於使用該特性的元素聲明的上方或前方以指定特性,使用時能夠省略Attribute後綴,根據想要初始化時調用特性類構造函數的不一樣,須要將該構造函數所需的參數(即位置參數)的值按照順序傳入,還能夠選擇是否指定命名參數的值,命名參數的值經過賦值運算符=顯式指定:

複製代碼
[Myself("MyClass", Author = "Me")]
//這個聲明在概念上等效於: //MyselfAttribute myselfObj = new MyselfAttribute("MyClass"); //myselfObj.Author = "Me"; //[Myself("MyClass", Author = "You")] //特性Myself能夠對同一元素指定屢次 //也能夠將多個特性合併在一個方括號裏: //[Myself("MyClass", Author = "Me"), Myself("MyClass", Author = "You")] public class MyClass { public void MyFunc([Myself("MyParameter")]int myNum) //在方法參數列表中給參數指定特性 { //do… } }
複製代碼

   通過編譯後,在元數據中查看到的類型定義中的特性信息:

複製代碼
TypeDef #1 (02000002)
-------------------------------------------------------
    TypDefName: MyClass  (02000002)
    Flags     : [Public] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit]  (00100001)
    Extends   : 01000013 [TypeRef] System.Object
    Method #1 (06000001) 
    -------------------------------------------------------
        MethodName: MyFunc (06000001)
        Flags     : [Public] [Virtual] [HideBySig] [NewSlot]  (000001c6)
        RVA       : 0x00002050
        ImplFlags : [IL] [Managed]  (00000000)
        CallCnvntn: [DEFAULT]
        hasThis 
        ReturnType: Void
        1 Arguments
            Argument #1:  I4
        1 Parameters
            (1) ParamToken : (08000001) Name : myNum flags: [none] (00000000)
            CustomAttribute #1 (0c000003)
            -------------------------------------------------------
                CustomAttribute Type: 06000009
                CustomAttributeName: MyselfAttribute :: instance void .ctor(class System.String)
                Length: 16
                Value : 01 00 0b 4d 79 50 61 72  61 6d 65 74 65 72 00 00 >   MyParameter  <
                ctor args: ("MyParameter")


    Method #2 (06000002) 
    -------------------------------------------------------
        MethodName: .ctor (06000002)
        Flags     : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor]  (00001886)
        RVA       : 0x0000205a
        ImplFlags : [IL] [Managed]  (00000000)
        CallCnvntn: [DEFAULT]
        hasThis 
        ReturnType: Void
        No arguments.

    CustomAttribute #1 (0c000015)
    -------------------------------------------------------
        CustomAttribute Type: 06000009
        CustomAttributeName: MyselfAttribute :: instance void .ctor(class System.String)
        Length: 24
        Value : 01 00 07 4d 79 43 6c 61  73 73 01 00 54 0e 06 41 >   MyClass  T  A<
                      : 75 74 68 6f 72 02 4d 65                          >uthor Me        <
        ctor args: ("MyClass")
複製代碼

  在IL代碼中查看到的類型定義中的特性信息:

 

 

  3、系統預約義的一些經常使用特性:

 

   4、特性一般配合反射起做用,在指定的時機經過反射得到自定義特性並對其進行操做,具體內容在下一章中介紹;

 

 

c# API接受圖片文件以Base64格式上傳圖片

 
複製代碼
 /// base64上傳圖片
        /// </summary> 
        /// <returns>成功上傳返回上傳後的文件名</returns>
        [HttpPost]
        public async Task<IHttpActionResult> UpLoadImageBase64()
        {
            HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];
            string text = context.Request.Form["file"];

            Stream stream = new MemoryStream(Convert.FromBase64String(text.Split(',')[1]));
            using (HttpClient client = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, ConfigurationManager.AppSettings["Imgaes"].ToString() + "/Upload");
                var content = new MultipartFormDataContent();

                //client.DefaultRequestHeaders.Add("fileext", HttpContext.Request.Headers["fileext"]);
                content.Add(new StreamContent(stream), "file", "file.jpg");
                request.Content = content;
                var response = await client.SendAsync(request);
                response.EnsureSuccessStatusCode();
                var filenamestr = await response.Content.ReadAsStringAsync();//返回結果
            }
            return Ok();
        }
複製代碼

 

 

 

.NET讀取json數據並綁定到對象

 

須要引用的命名空間:

 

 

 

讀取的具體應用:

this表明本實體(對象),經過PopulateObject,直接將讀取到的json數據與對象進行綁定

 

 

 

Json保存的具體應用:

將對象保存爲Json

 

 

JObject來源以下圖:

 

相關文章
相關標籤/搜索