.net 확장자 변경 .NET 2012/03/29 14:13


visual studio 개발툴 설정 --------------------------


이 기능은 이미 Visual Studio 2005 부터 제공이 되고 있었습니다. ( 2003 버전은 확인해 보지 못해서, 설치되신 분 알려주세요.. )
 
아래와 같이, Visual Studio 의 도구->옵션->텍스트 편집기->파일 확장명 에서 추가할 수 있습니다.


위와 같이 원하는 확장명을 입력하고, 다시 .umcx 페이지를 열게 되면, 아래와 같이 일반적인 웹페이지를 작성하는 것과 같이 이쁜 컬러와 자동완성 기능을 사용할 수 있습니다.



다음은 web.config 의 httpHandlers 섹션에 다음과 같이 작성합니다.
<httpHandlers>
         <add path="*.umcxverb="*type="System.Web.UI.PageHandlerFactoryvalidate="true"/>

여기에서 위의 Type 에 등록된 클래스를 조금 짚고 넘어 가겠습니다.
PageHandlerFactory 는 IHttpHandlerFactory 를 구현한 클래스 입니다.
이 인터페이스는 IHttpHandler 를 리턴하는 GetHandler 메서드를 구현하기만 하면 됩니다.
public IHttpHandler GetHandler(HttpContext context,
        string requestType, String url, String pathTranslated)
 
이 인터페이스를 구현한 클래스를 web.config 의 httpHandlers 에 등록하게 되면 좀더 유연하게 가령, 요청이 get , post 방식에 따라 서로 다른 HttpHandler 를 반환 할 수 있습니다.
IIS 에서 확장자 매핑하면서 get,post 등 요청 방식을 지정할 수 있게 되어있습니다.
하지만 위 인터페이스를 활용하여 요청방식에 따른 각기 기능을 하나의 클래스에 넣을 수 도 있구요, 페이지 요청 방식에 따라 서로 상이한 페이지를 보여 줄 수 도 있습니다.
다음 기회 언젠가 좀 더 자세히 파 보도록 하겠습니다.
 
다시 원점으로 돌아와서,
하지만 이것만으로 끝이 아니랍니다.
우라가 작성한 페이지를 컴파일하고 컴파일 하는 동안 코드를 생성하는데 사용되는 빌드 공급자를 정의해 주어야 합니다.
 
이것또한 최상위 web.config 에 다음과 같이 정의되어 있지요
<buildProviders>
        <add extension=".aspxtype="System.Web.Compilation.PageBuildProvider" />
        <add extension=".ascxtype="System.Web.Compilation.UserControlBuildProvider" />
        <add extension=".mastertype="System.Web.Compilation.MasterPageBuildProvider" />
        <add extension=".asmxtype="System.Web.Compilation.WebServiceBuildProvider" />
        <add extension=".ashxtype="System.Web.Compilation.WebHandlerBuildProvider" />
        <add extension=".soaptype="System.Web.Compilation.WebServiceBuildProvider" />
        <add extension=".resxtype="System.Web.Compilation.ResXBuildProvider" />
        <add extension=".resourcestype="System.Web.Compilation.ResourcesBuildProvider" />
        <add extension=".wsdltype="System.Web.Compilation.WsdlBuildProvider" />
        <add extension=".xsdtype="System.Web.Compilation.XsdBuildProvider" />
        <add extension=".jstype="System.Web.Compilation.ForceCopyBuildProvider" />
        <add extension=".lictype="System.Web.Compilation.IgnoreFileBuildProvider" />
        <add extension=".licxtype="System.Web.Compilation.IgnoreFileBuildProvider" />
        <add extension=".excludetype="System.Web.Compilation.IgnoreFileBuildProvider" />
        <add extension=".refreshtype="System.Web.Compilation.IgnoreFileBuildProvider" />
</buildProviders>
자주 보던 확장자들이 많이 있지요?
 
<compilation>
</compilation>
Web.config 의 위 섹션이 응용 프로그램의 컴파일을 담당하는 섹션입니다.
우리가 웹사이트를 작성하고 이후 수정된 사항을 복사만 하더라도 컴파일 되어 자동으로 적용되어 지는 미리 컴파일 기능 또한 위 섹션에서 담당하게 되지요~
 
이제 감이 오셨나요?
그럼 우리가 만든 페이지가 컴파일 되도록 하기 위해선 다음과 같이 섹션을 추가해 줍니다
<compilation debug="false">
         <buildProviders>
                  <add extension=".umcxtype="System.Web.Compilation.PageBuildProvider" />
         </buildProviders>
</compilation>
 


'.NET' 카테고리의 다른 글

.net 확장자 변경  (0) 2012/03/29
RegisterClientScriptBlock 과 RegisterStartupScript 의 고찰  (0) 2012/03/28
.net 확장자 변경시 iis 설정  (0) 2012/03/14
c# md5 클래스  (0) 2011/10/21
xml gzip 인코딩 파싱  (1) 2011/06/17
LINQ msdn  (0) 2010/12/10

asp.net 작업을 할때 자바스크립트 같은 Client 전용 스크립트를 웹프로그램 상에 삽입하고자 할때 유용하게 쓰이는 대표적인 놈들이다.

물론 .Net Framwork 1.1 시절때에는
Page.RegisterClientScriptBlock 메소드로 이름을 날렸었는데,

.Net Framework 2.0 이상부터는
ClientScriptManager 클래스로 바뀌었다. ( ClientScriptManager.RegisterClientScriptBlock 메소드 )

매번 작업할때마다 헷갈리는데 이 두 친구들 사이에는 미묘한 차이점이 있다.


1. RegisterClientScriptBlock 메소드는 body 상의 일반 요소가 로드되기 전에 발생
   -- 현재 페이지의 모양이 나오기 전에 빈 공백상태의 뒷 화면위에 경고창이 뜬다.

2. RegisterStartupScript 메소드는 body 상의 요소들이 로드 되고 난뒤 발생
   -- 현재 페이지의 모양그대로 나오고 경고창을 띄울 수 있다.

[주의사항]

다음과 같은 소스 중에서 아래의 RegisterClientScriptBlock  메소드를 수행하고 다음라인에 return 을 꼭 붙여주자.
안 넣으면, 자바스크립트 관련 소스가 제대로 적용되지 않고 Button2_Click 아래의 나머지 관련 소소들이 수행되어 버린다.

    protected void Button2_Click(object sender, EventArgs e)    {

                string script = "<script language='javascript'>alert('삭제할 글을 선택해 주십시오.');</script>";
                ClientScript.RegisterClientScriptBlock(typeof(Page), "ArticlesDelChk", script);
                return;

        ---- 이하 다른 관련 소스 계속 ----
        -------------------------------------
    }



'.NET' 카테고리의 다른 글

.net 확장자 변경  (0) 2012/03/29
RegisterClientScriptBlock 과 RegisterStartupScript 의 고찰  (0) 2012/03/28
.net 확장자 변경시 iis 설정  (0) 2012/03/14
c# md5 클래스  (0) 2011/10/21
xml gzip 인코딩 파싱  (1) 2011/06/17
LINQ msdn  (0) 2010/12/10
이제부터 .joa라는 확장자를 가진 파일을 ASP.DLL이 처리하게끔 설정하는 방법을 알아 보겠습니다.
먼저 IIS를 실행하고 확장자를 바꿔도 실행되게끔 하려는 웹사이트의 등록정보를 아래 그림을 참조하여 열어줍니다.




IIS 등록정보중 홈 디렉터리 텝을 클릭합니다. 홈 디렉터리 텝의 우측하단을 보면 구성버튼이 있습니다. 구성버튼을 인정
사정 보지말고 클릭해 줍니다. 그러면 다음과 같은 화면이 열립니다.


 

여기서 눈치 채신 분들 있을겁니다. 그렇습니다. 추가버튼을 클릭해서 확장명을 새로 등록하시면 되는 겁니다.
그럼 추가버튼을 클릭해 보겠습니다. 다음과 같은 화면이 실행됩니다.


 

여기서 실행파일 찾아보기 버튼을 이용해서 ASP.DLL을 등록해주고 확장명은 .JOA를 등록합니다.
동사는 레디오버튼 중 다음으로 제한 버튼을 클릭하고 GET,HEAD,POST,TRACE를 써 넣습니다.

ASP.DLL이 위치한 디렉터리는 C:\WINNT\system32\inetsrv\ 에서 찾으실 수 있습니다.
모든 사항을 맞게 등록했는지 아래 그림을 참조하시고 맞다면 확인 버튼을 클릭하고 적용을 차례로 누르고 IIS를 빠져나옵니다.


 

모든 과정이 끝났습니다. 이제 이 사이트는 .joa확장자도 처리가 가능합니다. 물론 처리는 asp.dll이 담당한 후 웹서버에
처리된 html을 반환합니다. 

'.NET' 카테고리의 다른 글

.net 확장자 변경  (0) 2012/03/29
RegisterClientScriptBlock 과 RegisterStartupScript 의 고찰  (0) 2012/03/28
.net 확장자 변경시 iis 설정  (0) 2012/03/14
c# md5 클래스  (0) 2011/10/21
xml gzip 인코딩 파싱  (1) 2011/06/17
LINQ msdn  (0) 2010/12/10
c# md5 클래스 .NET 2011/10/21 17:54
struct ABCDStruct
    {
        public uint A;
        public uint B;
        public uint C;
        public uint D;
    }

    public sealed class MD5Core
    {
        //Prevent CSC from adding a default public constructor
        private MD5Core() { }

        public static byte[] GetHash(string input, Encoding encoding)
        {
            if (null == input)
                throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
            if (null == encoding)
                throw new System.ArgumentNullException("encoding", "Unable to calculate hash over a string without a default encoding. Consider using the GetHash(string) overload to use UTF8 Encoding");

            byte[] target = encoding.GetBytes(input);

            return GetHash(target);
        }

        public static byte[] GetHash(string input)
        {
            return GetHash(input, new UTF8Encoding());
        }

        public static string GetHashString(byte[] input)
        {
            if (null == input)
                throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
            string retval = BitConverter.ToString(GetHash(input));
            retval = retval.Replace("-", "");
            return retval;
        }

        public static string GetHashString(string input, Encoding encoding)
        {
            if (null == input)
                throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
            if (null == encoding)
                throw new System.ArgumentNullException("encoding", "Unable to calculate hash over a string without a default encoding. Consider using the GetHashString(string) overload to use UTF8 Encoding");

            byte[] target = encoding.GetBytes(input);

            return GetHashString(target);
        }

        public static string GetHashString(string input)
        {
            return GetHashString(input, new UTF8Encoding());
        }

        public static byte[] GetHash(byte[] input)
        {
            if (null == input)
                throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");

            //Intitial values defined in RFC 1321
            ABCDStruct abcd = new ABCDStruct();
            abcd.A = 0x67452301;
            abcd.B = 0xefcdab89;
            abcd.C = 0x98badcfe;
            abcd.D = 0x10325476;

            //We pass in the input array by block, the final block of data must be handled specialy for padding & length embeding
            int startIndex = 0;
            while (startIndex <= input.Length - 64)
            {
                MD5Core.GetHashBlock(input, ref abcd, startIndex);
                startIndex += 64;
            }
            // The final data block.
            return MD5Core.GetHashFinalBlock(input, startIndex, input.Length - startIndex, abcd, (Int64)input.Length * 8);
        }

        internal static byte[] GetHashFinalBlock(byte[] input, int ibStart, int cbSize, ABCDStruct ABCD, Int64 len)
        {
            byte[] working = new byte[64];
            byte[] length = BitConverter.GetBytes(len);

            //Padding is a single bit 1, followed by the number of 0s required to make size congruent to 448 modulo 512. Step 1 of RFC 1321
            //The CLR ensures that our buffer is 0-assigned, we don't need to explicitly set it. This is why it ends up being quicker to just

            //use a temporary array rather then doing in-place assignment (5% for small inputs)
            Array.Copy(input, ibStart, working, 0, cbSize);
            working[cbSize] = 0x80;

            //We have enough room to store the length in this chunk
            if (cbSize <= 56)
            {
                Array.Copy(length, 0, working, 56, 8);
                GetHashBlock(working, ref ABCD, 0);
            }
            else //We need an aditional chunk to store the length
            {
                GetHashBlock(working, ref ABCD, 0);
                //Create an entirely new chunk due to the 0-assigned trick mentioned above, to avoid an extra function call clearing the array
                working = new byte[64];
                Array.Copy(length, 0, working, 56, 8);
                GetHashBlock(working, ref ABCD, 0);
            }
            byte[] output = new byte[16];
            Array.Copy(BitConverter.GetBytes(ABCD.A), 0, output, 0, 4);
            Array.Copy(BitConverter.GetBytes(ABCD.B), 0, output, 4, 4);
            Array.Copy(BitConverter.GetBytes(ABCD.C), 0, output, 8, 4);
            Array.Copy(BitConverter.GetBytes(ABCD.D), 0, output, 12, 4);
            return output;
        }

        // Performs a single block transform of MD5 for a given set of ABCD inputs
        /* If implementing your own hashing framework, be sure to set the initial ABCD correctly according to RFC 1321:
        // A = 0x67452301;
        // B = 0xefcdab89;
        // C = 0x98badcfe;
        // D = 0x10325476;
        */
        internal static void GetHashBlock(byte[] input, ref ABCDStruct ABCDValue, int ibStart)
        {
            uint[] temp = Converter(input, ibStart);
            uint a = ABCDValue.A;
            uint b = ABCDValue.B;
            uint c = ABCDValue.C;
            uint d = ABCDValue.D;

            a = r1(a, b, c, d, temp[0], 7, 0xd76aa478);
            d = r1(d, a, b, c, temp[1], 12, 0xe8c7b756);
            c = r1(c, d, a, b, temp[2], 17, 0x242070db);
            b = r1(b, c, d, a, temp[3], 22, 0xc1bdceee);
            a = r1(a, b, c, d, temp[4], 7, 0xf57c0faf);
            d = r1(d, a, b, c, temp[5], 12, 0x4787c62a);
            c = r1(c, d, a, b, temp[6], 17, 0xa8304613);
            b = r1(b, c, d, a, temp[7], 22, 0xfd469501);
            a = r1(a, b, c, d, temp[8], 7, 0x698098d8);
            d = r1(d, a, b, c, temp[9], 12, 0x8b44f7af);
            c = r1(c, d, a, b, temp[10], 17, 0xffff5bb1);
            b = r1(b, c, d, a, temp[11], 22, 0x895cd7be);
            a = r1(a, b, c, d, temp[12], 7, 0x6b901122);
            d = r1(d, a, b, c, temp[13], 12, 0xfd987193);
            c = r1(c, d, a, b, temp[14], 17, 0xa679438e);
            b = r1(b, c, d, a, temp[15], 22, 0x49b40821);

            a = r2(a, b, c, d, temp[1], 5, 0xf61e2562);
            d = r2(d, a, b, c, temp[6], 9, 0xc040b340);
            c = r2(c, d, a, b, temp[11], 14, 0x265e5a51);
            b = r2(b, c, d, a, temp[0], 20, 0xe9b6c7aa);
            a = r2(a, b, c, d, temp[5], 5, 0xd62f105d);
            d = r2(d, a, b, c, temp[10], 9, 0x02441453);
            c = r2(c, d, a, b, temp[15], 14, 0xd8a1e681);
            b = r2(b, c, d, a, temp[4], 20, 0xe7d3fbc8);
            a = r2(a, b, c, d, temp[9], 5, 0x21e1cde6);
            d = r2(d, a, b, c, temp[14], 9, 0xc33707d6);
            c = r2(c, d, a, b, temp[3], 14, 0xf4d50d87);
            b = r2(b, c, d, a, temp[8], 20, 0x455a14ed);
            a = r2(a, b, c, d, temp[13], 5, 0xa9e3e905);
            d = r2(d, a, b, c, temp[2], 9, 0xfcefa3f8);
            c = r2(c, d, a, b, temp[7], 14, 0x676f02d9);
            b = r2(b, c, d, a, temp[12], 20, 0x8d2a4c8a);

            a = r3(a, b, c, d, temp[5], 4, 0xfffa3942);
            d = r3(d, a, b, c, temp[8], 11, 0x8771f681);
            c = r3(c, d, a, b, temp[11], 16, 0x6d9d6122);
            b = r3(b, c, d, a, temp[14], 23, 0xfde5380c);
            a = r3(a, b, c, d, temp[1], 4, 0xa4beea44);
            d = r3(d, a, b, c, temp[4], 11, 0x4bdecfa9);
            c = r3(c, d, a, b, temp[7], 16, 0xf6bb4b60);
            b = r3(b, c, d, a, temp[10], 23, 0xbebfbc70);
            a = r3(a, b, c, d, temp[13], 4, 0x289b7ec6);
            d = r3(d, a, b, c, temp[0], 11, 0xeaa127fa);
            c = r3(c, d, a, b, temp[3], 16, 0xd4ef3085);
            b = r3(b, c, d, a, temp[6], 23, 0x04881d05);
            a = r3(a, b, c, d, temp[9], 4, 0xd9d4d039);
            d = r3(d, a, b, c, temp[12], 11, 0xe6db99e5);
            c = r3(c, d, a, b, temp[15], 16, 0x1fa27cf8);
            b = r3(b, c, d, a, temp[2], 23, 0xc4ac5665);

            a = r4(a, b, c, d, temp[0], 6, 0xf4292244);
            d = r4(d, a, b, c, temp[7], 10, 0x432aff97);
            c = r4(c, d, a, b, temp[14], 15, 0xab9423a7);
            b = r4(b, c, d, a, temp[5], 21, 0xfc93a039);
            a = r4(a, b, c, d, temp[12], 6, 0x655b59c3);
            d = r4(d, a, b, c, temp[3], 10, 0x8f0ccc92);
            c = r4(c, d, a, b, temp[10], 15, 0xffeff47d);
            b = r4(b, c, d, a, temp[1], 21, 0x85845dd1);
            a = r4(a, b, c, d, temp[8], 6, 0x6fa87e4f);
            d = r4(d, a, b, c, temp[15], 10, 0xfe2ce6e0);
            c = r4(c, d, a, b, temp[6], 15, 0xa3014314);
            b = r4(b, c, d, a, temp[13], 21, 0x4e0811a1);
            a = r4(a, b, c, d, temp[4], 6, 0xf7537e82);
            d = r4(d, a, b, c, temp[11], 10, 0xbd3af235);
            c = r4(c, d, a, b, temp[2], 15, 0x2ad7d2bb);
            b = r4(b, c, d, a, temp[9], 21, 0xeb86d391);

            ABCDValue.A = unchecked(a + ABCDValue.A);
            ABCDValue.B = unchecked(b + ABCDValue.B);
            ABCDValue.C = unchecked(c + ABCDValue.C);
            ABCDValue.D = unchecked(d + ABCDValue.D);
            return;
        }

        //Manually unrolling these equations nets us a 20% performance improvement
        private static uint r1(uint a, uint b, uint c, uint d, uint x, int s, uint t)
        {
            // (b + LSR((a + F(b, c, d) + x + t), s))
            //F(x, y, z) ((x & y) | ((x ^ 0xFFFFFFFF) & z))
            return unchecked(b + LSR((a + ((b & c) | ((b ^ 0xFFFFFFFF) & d)) + x + t), s));
        }

        private static uint r2(uint a, uint b, uint c, uint d, uint x, int s, uint t)
        {
            // (b + LSR((a + G(b, c, d) + x + t), s))
            //G(x, y, z) ((x & z) | (y & (z ^ 0xFFFFFFFF)))
            return unchecked(b + LSR((a + ((b & d) | (c & (d ^ 0xFFFFFFFF))) + x + t), s));
        }

        private static uint r3(uint a, uint b, uint c, uint d, uint x, int s, uint t)
        {
            // (b + LSR((a + H(b, c, d) + k + i), s))
            //H(x, y, z) (x ^ y ^ z)
            return unchecked(b + LSR((a + (b ^ c ^ d) + x + t), s));
        }

        private static uint r4(uint a, uint b, uint c, uint d, uint x, int s, uint t)
        {
            // (b + LSR((a + I(b, c, d) + k + i), s))
            //I(x, y, z) (y ^ (x | (z ^ 0xFFFFFFFF)))
            return unchecked(b + LSR((a + (c ^ (b | (d ^ 0xFFFFFFFF))) + x + t), s));
        }

        // Implementation of left rotate
        // s is an int instead of a uint becuase the CLR requires the argument passed to >>/<< is of
        // type int. Doing the demoting inside this function would add overhead.
        private static uint LSR(uint i, int s)
        {
            return ((i << s) | (i >> (32 - s)));
        }

        //Convert input array into array of UInts
        private static uint[] Converter(byte[] input, int ibStart)
        {
            if (null == input)
                throw new System.ArgumentNullException("input", "Unable convert null array to array of uInts");
            uint[] result = new uint[16];
            for (int i = 0; i < 16; i++)
            {
                result[i] = (uint)input[ibStart + i * 4];
                result[i] += (uint)input[ibStart + i * 4 + 1] << 8;
                result[i] += (uint)input[ibStart + i * 4 + 2] << 16;
                result[i] += (uint)input[ibStart + i * 4 + 3] << 24;
            }
            return result;
        }
    }

그냥 복사해서 사용하심 됩니다^^ php md5 와도 동일한 데이터를 가져옵니다~ 

'.NET' 카테고리의 다른 글

.net 확장자 변경  (0) 2012/03/29
RegisterClientScriptBlock 과 RegisterStartupScript 의 고찰  (0) 2012/03/28
.net 확장자 변경시 iis 설정  (0) 2012/03/14
c# md5 클래스  (0) 2011/10/21
xml gzip 인코딩 파싱  (1) 2011/06/17
LINQ msdn  (0) 2010/12/10
xml gzip 인코딩 파싱 .NET 2011/06/17 18:43
휴 대구시청 모바일 웹을 개발하던중...

xml 호출이 400error 헐..ㅠㅠ 절망 이였다..

php 에서 가공하여 xml 을 던져주는 형태 였으며, fiddreer 로 살펴본 결과 해당 php 페이지에서 gzip 으로 압축(?) 인코 (?) 딩 이 되어있었다.. 모였지 햇갈리네.ㅡ.ㅡ;;

호출은 webclient 로 호출하였으며.. 

WebClient wc = new WebClient();
                wc.Headers.Add("Accept", "*/*");
                wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)");
                string html;
                using (var webStream = wc.OpenRead(strXmlUrl))
                using (var gzipStream = new GZipStream(webStream, CompressionMode.Decompress))
                using (var streamReader = new StreamReader(gzipStream))
                    html = streamReader.ReadToEnd();

                XmlDocument xdoc = new XmlDocument();
                xdoc.LoadXml(html);

이런식으로 하였다. 보면   new GZipStream 이부분의 클래스를 설정 하였다...GZipStream 으로 CompressionMode.Decompress  로하여 압축을 푼것.. 간단한대.. 노가다 를 했다.ㅠㅠ

 

'.NET' 카테고리의 다른 글

.net 확장자 변경  (0) 2012/03/29
RegisterClientScriptBlock 과 RegisterStartupScript 의 고찰  (0) 2012/03/28
.net 확장자 변경시 iis 설정  (0) 2012/03/14
c# md5 클래스  (0) 2011/10/21
xml gzip 인코딩 파싱  (1) 2011/06/17
LINQ msdn  (0) 2010/12/10
LINQ msdn .NET 2010/12/10 15:37
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

링크 타시면 LINQ에 대한 예제 소스들이

많이 있네요^^

참고하세요 저도 열공중!!

'.NET' 카테고리의 다른 글

.net 확장자 변경  (0) 2012/03/29
RegisterClientScriptBlock 과 RegisterStartupScript 의 고찰  (0) 2012/03/28
.net 확장자 변경시 iis 설정  (0) 2012/03/14
c# md5 클래스  (0) 2011/10/21
xml gzip 인코딩 파싱  (1) 2011/06/17
LINQ msdn  (0) 2010/12/10