巧みに使うNameによるログの統一識別(続き)

17294 ワード

ミミミミミミミミミミミミミミ
ミミミミミミミミミミミミミミミミミミミミミミミNameによるログの統一
ミミミミミミミミミミミミミミミミミミミミミミミNameによるログの統一識別(続き)
ミミミミミミミミミミミミミミミミミミミミミミミNameによるログの統一(完結編)
ミミミミミミミミミミミミ中出しNetブロッキング
ミミミミミミミミミミミミミミミミミミミミミミミNameによるログの統一識別(java-logback編)
 
前文を繰り上げない.本論文では,シーンをシミュレートすることによって問題を投げ出す.
Webサイトのプログラムにtmp 1を新規作成しました.ashxファイル.クラスコードは次のとおりです.
using System;
using System.IO;
using System.Threading;
using System.Web;

namespace PaymentPlatform.Test
{
    /// 
    /// tmp1      
    /// 
    public class tmp1 : IHttpHandler
    { 
        public tmp1()
        {
            Thread.CurrentThread.Name = string.Format("[{0}]",  Guid.NewGuid().ToString().Replace("-", "").ToUpper());
             
            WriteLog("=========");
        }
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain"; 
            WriteLog("ProcessRequest");
            context.Response.Write("1");

        }

        private static void WriteLog(string log)
        {
            string logFileName = string.Format("{0:yyyyMMdd}-{1}.txt", DateTime.Now, "Info");
            logFileName = Path.Combine(System.Configuration.ConfigurationManager.AppSettings["logPath"], logFileName);
            log = (System.Threading.Thread.CurrentThread.Name ?? "null") + log;
            using (StreamWriter sw = new StreamWriter(logFileName, true))
            {
                sw.WriteLine(log);
                sw.Close();
            }
        }

        public bool IsReusable
        {
            get {return false; }
        }
    }
}

 

注意,我在tmp1的构造方法里给当前线程的Name属性赋值。在后续包括ProcessRequest方法里记日志时,会获取当前线程Name并打印出来。
我做了如下几种测试:

  • ie里访问tmp1.ashx,包括频繁刷新,所记录的日志都可以获取到当前线程Name。
  • 构造Method为Get的HttpWebRequest请求,并发测试,所记录的日志都可以获取到当前线程Name。
  • 构造Method为Post的HttpWebRequest请求,在不传递参数(ContentLength=0)的情况下,并发测试,发现所记录的日志都可以获取到当前线程Name。
  • 构造Method为Post的HttpWebRequest请求,在传递参数的情况下,并发测试,发现所记录的日志都无法获取到当前线程Name。

测试用例代码如下:

 1 using CommonUtils;
 2 using Microsoft.VisualStudio.TestTools.UnitTesting;
 3 using System.Collections.Generic;
 4 using System.IO;
 5 using System.Linq;
 6 using System.Net;
 7 using System.Text;
 8 using System.Threading;
 9 
10 namespace Test.TechArt
11 {
12     [TestClass]
13     public class HttpPostTest
14     {
15         [TestMethod]
16         public void ConcurrentTest()
17         {
18             for (int j = 0; j < 10; j++)
19             {
20                 CallASHXAPI();
21             }
22 
23             List list = new List();
24             for (int i = 0; i < 500; i++)
25             {
26                 list.Add(new Thread(() =>
27                 {
28                     for (int j = 0; j < 50; j++)
29                     {
30                         CallASHXAPI();
31                     }
32                 }));
33             }
34             list.AsParallel().ForAll(t => t.Start());
35             Thread.Sleep(15000);
36         }
37 
38         [TestMethod]
39         public void CallASHXAPI()
40         {
41   
42             string requestUrl = "http://localhost:8076/Test/tmp1.ashx";
43             
44             string ret = RequestUrlPost(requestUrl);
45             LogHelper.Write("" + ret);
46             
47         }
48 
49         private string RequestUrlGet(string requestUrl)
50         {
51             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
52             using (var reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8))
53             {
54                 return reader.ReadToEnd();
55             }
56         }
57         private string RequestUrlPost(string requestUrl)
58         {
59             /*
60 61              */
62             //  , tmp1.ashx ProcessRequest                   Name
63             //string requestMsg = "";
64             //  , tmp1.ashx ProcessRequest                   Name
65             string requestMsg = "1";
66 
67             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
68             request.Method = "POST";
69 
70             byte[] aryBuf = Encoding.UTF8.GetBytes(requestMsg);
71             request.ContentLength = aryBuf.Length;
72 
73             using (Stream writer = request.GetRequestStream())
74             {
75                 writer.Write(aryBuf, 0, aryBuf.Length);
76                 writer.Close();
77                 writer.Dispose();
78             }
79             using (var reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8))
80             {
81                 return reader.ReadToEnd();
82             }
83         }
84     }
85 }

 
そこで,問題として,Httpストリームリクエストパスと非パスの2つのケースにはどのような違いがあるのか.