NOD32 與 無法將工作階段狀態要求送至工作階段狀態伺服器

當我們在設定 ASP.NET 應用程式以 "ASP.NET 狀態服務" 儲存 Session 資料時,可能有人曾經預過這個問題,錯誤訊息如下:

無法將工作階段狀態要求送至工作階段狀態伺服器。請確定 ASP.NET 狀態服務已經啟動且用戶端與伺服器的通訊埠都相同。如果伺服器是在遠端電腦上,請檢查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,確定它是否接受遠端要求。如果伺服器是在本機電腦上,而且前述登錄值不存在或設定為 0,狀態伺服器連接字串就必須使用 'localhost' 或 '127.0.0.1' 做為伺服器名稱。

 '/' 應用程式中發生伺服器錯誤。

無法將工作階段狀態要求送至工作階段狀態伺服器。請確定 ASP.NET 狀態服務已經啟動且用戶端與伺服器的通訊埠都相同。如果伺服器是在遠端電腦上,請檢查 HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ aspnet_state\ Parameters\ AllowRemoteConnection 的值,確定它是否接受遠端要求。如果伺服器是在本機電腦上,而且前述登錄值不存在或設定為 0,狀態伺服器連接字串就必須使用 'localhost' 或 '127.0.0.1' 做為伺服器名稱。

我之前就是怎麼調整都還是連不上,明明只是「本地連接 ( Local Connection )」而已,也沒有設定任何讓【ASP.NET 狀態服務】開放遠端連接的機碼,但為什麼總是連不上呢!而且自己用 Telnet 指令測試連結 ASP.NET 狀態服務的 Port 42424 也都可以正常連線,但就是 ASP.NET 無法連線而已,遇到這種情況真的會吐血。

查了好幾個小時後才知道,原來是 NOD32 防毒軟體的問題,阻擋了「疑似」HTTP 的連線,因為 NOD32 有支援 Internet Monitor (IMON) 的功能,可以偵測與過濾有問題的 HTTP 封包,就是因為這樣才導致無法使用 ASP.NET 狀態服務。

解決的方法如下:

  1. 先開啟 NOD32 Control Center,點選 IMON,再點選 Setup 按鈕

    先開啟 NOD32 Control Center,點選 IMON,再點選 Setup 按鈕

  2. 開啟 IMON Setup 後選取 HTTP 頁籤,然後取消勾選 Automatically detect HTTP communication on other ports.



  3. 按下 OK 後就立即可以用 ASP.NET 狀態服務了

 

所以如果有人有安裝防毒軟體或個人防火牆軟體的話,注意可能是這個問題,去看看有沒有設定可以將 ASP.NET 狀態服務排除在掃瞄範圍之外!

 

  

此文章由 will 發表於 2008/1/31 上午 12:25:00

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: ASP.NET

標籤: ,

收藏:

介紹好用工具:grepWin

你有想找檔案但是找不到的經驗嗎? 或是為了想將某個目錄下所有檔案的內容批次取代特定字串的經驗嗎?

我們知道 Windows 有內建的搜尋工具,但是用過的都知道,大概只能找檔名而已,雖然有找 "檔案裡的字或片語" 的功能,但卻常常都找不到,急的時候真的會氣死!

Windows 內建的搜尋工具

檔案裡的字或片語

我在知道 grepWin 這個軟體之前,通常我會使用 UltraEdit, Notepad++ 或是 Visual Studio 等軟體,幫助我做搜尋與取代的動作,但怎麼用都沒有比用 grepWin 還來的方便、親切又有效率,因為 grepWin 直接跟檔案總管結合,只要在目錄上按滑鼠右鍵,就可以開始進行搜尋或取代的動作,且搜尋與取代都可以用 Regular Expression 語法,程式本身又很小 ( 執行檔只有 492KB ),搜尋起來真的很快,且搜尋的結果是窗還可以在檔案清單中按下滑鼠右鍵,所出現的 context menu 會出現跟檔案總管一樣的選單,也可以直接開啟檔案。但使用取代(Replace)功能時還是要小心,因為功能實在太強了,所以在執行前最好能先備份過,以免檔案救不回來。

唯一個缺點就是無法搜尋「目錄名稱」,但如果要搜尋目錄的話可以直接使用 Windows 內建的搜尋工具。

grepWin 的官方網站在此: http://tools.tortoisesvn.net/grepWin

以下是簡單的操作圖示:

圖一:按下滑鼠右鍵選 context menu 的 grepWin...
圖一:按下滑鼠右鍵選 context menu 的 grepWin...


圖二:操作畫面摘要

1. 要搜尋的檔案內容片段,上面的 Regex Search 與 Text Search 讓你選擇是否使用 RegEx 語法 ( .NET style )

2. 要將搜尋到的字取代成什麼字元,如果選 RegEx 語法的話,還可以用 $1, $2 這種語法

3. 可以限制搜尋檔案的大小,以縮小搜尋範圍,加快搜尋速度

4. 打勾之後就可以搜尋被設定隱藏屬性的檔案

5. 可以輸入要搜尋的檔案名稱

6. 要搜尋的檔案名稱也可以用 RegEx 語法,真的很好用!

  

此文章由 will 發表於 2008/1/30 上午 01:33:00

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: 介紹好用工具

標籤:

收藏:

如何用 TortoiseSVN 復原錯誤的簽入動作

在一個開發團隊裡,當有人將錯誤的程式碼簽入(Commit)到 Subversion 儲存庫(Repository)去,的確會造成許多人的麻煩,這時程式開發經理應該就要立即出面,將這類的問題排除。

如果目前最新的版本(Revision)是 9 的話,你可能想要將版本復原到 Revision 8,這時候有兩種方法可以做:

1. 透過 Update to revision.. 將目前的程式碼更新至第 8 版

透過 Update to revision.. 將目前的程式碼更新至第 8 版

但這種作法是錯的!

因為這方法只是將你的工作目錄更新到舊的版本(第 8 版),這時重新所做的修改其實都會失敗,因為當你要 commit 的時候,Subversion 就會告訴你必須先更新(SVN Update)過才能 commit,到時就會發生衝突!

2. 透過 Merge (合併) 將目前的程式碼合併到第 8 版

透過 Merge (合併) 將目前的程式碼合併到第 8 版

這才是正確的作法!

因為這等於是將目前的版本 ( 第 9 版 ) 直接合併到第 8 版去,現有的工作目錄還是處於第 9 版的狀態,只是所有程式碼因為執行合併的關係而變成第 8 版的內容而已,當你 Merge 成功以後,還必須 commit 一次,讓第9版修改後的程式簽入到儲存庫 ( 成為第 10 版 ),這時的第 10 版就會跟原本的第 8 版一模一樣了!此時,再請專案成員做一次 SVN Update 就可以讓大家回復到正確程式碼的狀態了!

而將目前的 Revision 合併回上一個 Revision 的方式如下,以下將以 TortoiseSVN 工具做說明:

  1. 先在工作目錄的根目錄顯選取 SVN Merge 功能

    透過 Merge (合併) 將目前的程式碼合併到第 8 版

    開啟 SVN Merge 對話方塊

  2. 在 From: 的地方選取 "HEAD Revision" ,在 To: 的地方選取 Revision 並設定到你想要還原到的版本編號 ( 此範例是 8 ),最後按下 Merge 按鈕

    在 From: 的地方選取 "HEAD Revision" ,在 To: 的地方選取 Revision 並設定到你想要還原到的版本編號 ( 此範例是 8 ),最後按下 Merge 按鈕

  3. 此時你將會看到在工作目錄下的檔案已經被異動了,最後再執行 SVN Commit 就可以復原成功了!

 

  

此文章由 will 發表於 2008/1/29 上午 12:04:00

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: ,

收藏:

如何讓 UserControl 與 RequireFieldValidator 搭配使用

基本上只要是繼承於 Control 型別的控制項都可以跟 *Validator 控制項搭配使用!只是你必須在 UserControl 的類別特別定義 2 個 Class Attribute 才能正確使用。

一個是 [ValidationProperty("Text")] ,而另一個是[ControlValueProperty("Text")] ,分別用來宣告此類別的驗證用屬性要取得此類別的哪一個屬性,與此控制項的 Value 是屬於哪一個屬性。

但其中有個很重要的觀念,就是如果 UserControl 要搭配使用 RequiredFieldValidator 時,若要讓啟用 EnableClientScript 時可以正常運作 ( 也就是直接在 Browser 端直接用 JavaScript 先驗證其值 ),必須在該 UserControl 加上一個隱藏欄位,且以該隱藏欄位的 id 必須以這個 UserControl 的 this.ClientID 為名,才能讓 RequiredFieldValidator 控制項透過 JavaScript 取得要驗證的值,且當 UserControl 當中的欄位資料更新的時候,也要立即透過 JavaScript 一併更新該隱藏欄位的值才行!如果不加上這個隱藏欄位並不會出錯,只是做驗證的時候必須要等表單 PostBack 回伺服器端才能驗證而已,但這樣就顯的不有點美中不足了。

以下是個簡單的範例,各位看程式碼就知道我在寫什麼了,注意【粗體字】的部分。

[code:xml]

<%@ Control Language="C#" ClassName="City" CodeFile="City.ascx.cs" Inherits="UserControls_DataType_City" %>
<asp:DropDownList 
   ID="ddlCity" 
   runat="server" 
   EnableViewState="true"
   AutoPostBack="false">
</asp:DropDownList>

[/code]

Code Behind 的程式碼如下:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;

[ValidationProperty("Text"), ControlValueProperty("Text")]
public partial class UserControls_DataType_City : System.Web.UI.UserControl
{
    [Bindable(true)]
    [Description("台灣縣市")]
    [Category("Appearance")]
    public string Text
    {
        get
        {
            return ddlCity.SelectedValue;
        }
        set
        {
            ddlCity.SelectedValue = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ddlCity.Items.Add(new ListItem("-- 請選擇 --", ""));

            ddlCity.Items.Add(new ListItem("基隆市", "基隆市"));
            ddlCity.Items.Add(new ListItem("台北市", "台北市"));
            ddlCity.Items.Add(new ListItem("台北縣", "台北縣"));
            ddlCity.Items.Add(new ListItem("桃園縣", "桃園縣"));
            ddlCity.Items.Add(new ListItem("新竹市", "新竹市"));
            ddlCity.Items.Add(new ListItem("新竹縣", "新竹縣"));
            ddlCity.Items.Add(new ListItem("苗栗縣", "苗栗縣"));
            ddlCity.Items.Add(new ListItem("台中市", "台中市"));
            ddlCity.Items.Add(new ListItem("台中縣", "台中縣"));
            ddlCity.Items.Add(new ListItem("彰化縣", "彰化縣"));
            ddlCity.Items.Add(new ListItem("南投縣", "南投縣"));
            ddlCity.Items.Add(new ListItem("雲林縣", "雲林縣"));
            ddlCity.Items.Add(new ListItem("嘉義市", "嘉義市"));
            ddlCity.Items.Add(new ListItem("嘉義縣", "嘉義縣"));
            ddlCity.Items.Add(new ListItem("台南市", "台南市"));
            ddlCity.Items.Add(new ListItem("台南縣", "台南縣"));
            ddlCity.Items.Add(new ListItem("高雄市", "高雄市"));
            ddlCity.Items.Add(new ListItem("高雄縣", "高雄縣"));
            ddlCity.Items.Add(new ListItem("屏東縣", "屏東縣"));
            ddlCity.Items.Add(new ListItem("台東縣", "台東縣"));
            ddlCity.Items.Add(new ListItem("花蓮縣", "花蓮縣"));
            ddlCity.Items.Add(new ListItem("宜蘭縣", "宜蘭縣"));
            ddlCity.Items.Add(new ListItem("澎湖縣", "澎湖縣"));
            ddlCity.Items.Add(new ListItem("金門縣", "金門縣"));
            ddlCity.Items.Add(new ListItem("連江縣", "連江縣"));
        }

        // 為了要讓 RequireFieldValidator 的 EnableClientScript 屬性
        // 可以正常運作,需要定義一個以 this.ClientID 為名的欄位,才
        // 可以供 Validator 控制項的 JavaScript 做判斷!

        Page.ClientScript.RegisterHiddenField(this.ClientID, Text);

        ddlCity.Attributes["onchange"] = 
            "document.getElementById('" + this.ClientID + "').value = this.value;";
    }
}

 

  

此文章由 will 發表於 2008/1/28 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | C# | JavaScript

標籤: , , ,

收藏:

ASP.NET 當上傳檔案過大時任何回應瀏覽器的動作都無效

基本的 HTTP 通訊協定就是 Browser 對 Server 發出 HTTP Request 指令,Server 收到 HTTP Request 指令後開始進行資料的運算與處理,然後從 Server 回應 HTTP Response 給 Browser,Browser 收到 HTTP Response 指令後負責處理網頁的顯示或網頁轉向等動作。

所以當你透過 HTTP 上傳過大的檔案時,雖然 ASP.NET 程式有開始執行,但是只要執行到 ASP.NET 設定的 maxRequestLength 上限時,就會將此次的 HTTP 對話直接關閉 ( 斷線 ),導致 Browser 無法完成 HTTP Request 這個動作,所以連 HTTP Request 都沒有完成的情況下,怎麼可能還從 Server 那邊得到 HTTP Response 指令!所以 Browser 根本不知道如何處理接下來的動作,這時如果你是使用 Internet Explorer 瀏覽器的話,就會出現 IE 預設的錯誤訊息 ( 請檢查您的網際網路連線。嘗試瀏覽其他網站,確定您已連線至網際網路。 ),使用者會感覺上好像 Server 端的程式出錯了,但是其實是 Browser 無法處理 HTTP 指令才導致這個畫面的出現。

所以你寫的任何要回應給 Browser 的程式都是沒有用的 ( 例如:  Response.Redirect("Error.htm"); ),Browser 完全接收不到喔!! 也因此這問題不只在 ASP.NET 會發生,在其他的 Web 應用平台都會有類似的問題,但這說穿了也不應該是個問題,你只要了解 HTTP 的運作機制,就不難了解為什麼會這樣!

寫程式最重要的就是基礎觀念有沒有紮實學好! 沒有好的觀念無法真正寫好程式,但問題遇到了解決不了或無法理解大部分的時候是正常的,反正多看書、多寫程式就會多學到一點經驗。

預設來說 ASP.NET 的最大的檔案上傳限制為 4096 (4 MB),如果要調大檔案上傳的限制必須要調整 web.config 中在 <system.web> 區段下新增一個 <httpRuntime> 的設定,如下:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="40000" executionTimeout="300"/>
  </system.web>
</configuration>

相關網址

  

此文章由 will 發表於 2008/1/27 上午 01:22:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | Web

標籤: , , , ,

收藏: