2011年9月20日 星期二

馬上可用的WCF診斷設定

 

  1. 以下設定的initializeData目錄需有網站權限。
  2. switch這邊設定為All,代表會輸出所有診斷的訊息,可以依據需要來調整。
<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="All">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add initializeData="D:\WebSites\TEMP\site_messages.svclog"
    type="System.Diagnostics.XmlWriterTraceListener"
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
            <filter type="" />
          </add>
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="All"
          propagateActivity="true">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add initializeData="D:\WebSites\TEMP\site_tracelog.svclog"
    type="System.Diagnostics.XmlWriterTraceListener"
    name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
            <filter type="" />
          </add>
        </listeners>
      </source>
    </sources>
<system.diagnostics>
	
<system.serviceModel>
    <diagnostics>      
      <messageLogging logMalformedMessages="true"
		  logMessagesAtTransportLevel="true"
                    logEntireMessage="true"           
		  logMessagesAtServiceLevel="true"           
		  maxMessagesToLog="3000"/>
    </diagnostics>
</system.serviceModel>
參考資料:

  1. WCF管理與診斷

  2. Configuring Tracing的Trace Level部分

2011年9月3日 星期六

[ASP.NET]使用反射機制驅動事件

問題:在ASP.NET的Callback發生時,可以同時處理Postback機制的事件,但是Postback的頁面會刷掉Callback的結果,造成畫面閃動的現象。

但是我還是想要由Ccallback執行Poastback的事件。

目標:可以應用在ASP.NET的Web From上,由一個控制項來驅動另一個控制項的事件。注意,在同一個類別中不適用(用一般的方法就好啦)。

方法:1. 註冊一個事件,可以使用

        protected void Button1_Click(object sender, EventArgs e)
        {            
        }

(.aspx 的 AutoEventWireup="true")



或是

        protected void Page_Load(object sender, EventArgs e)
        {
            Button1.Click +=new EventHandler(Button1_Click);
        }


2. 找到畫面上的目標控制項,就是要驅動事件的控制項。例如要驅動Button的Click事件


Button btn = this.Page.FindControl("button1") as Button;


3. 使用反射方法找到Click事件的委託(Delegate),再執行這個事件。

RaiseEvent(btn, "Click", new EventArgs());
private void RaiseEvent(object sender, string eventName, EventArgs args)
{
    PropertyInfo property = sender.GetType().GetProperty("Events",
                                             BindingFlags.Instance |
                                             BindingFlags.NonPublic);
    EventHandlerList ehList = (EventHandlerList)property.GetValue(sender, null);
    FieldInfo fieldInfo = sender.GetType().GetField("Event" + eventName,
                                                  BindingFlags.Static |
                                                  BindingFlags.NonPublic);
    Delegate d = ehList[fieldInfo.GetValue(null)];
    object[] objects = new object[] { sender, new EventArgs() };
    d.DynamicInvoke(objects);
}

 


參考文件: