ASP.NET
2009. 10. 31.
안혁
http://hyok.kr



ASP.NET으로 구성된 웹 어플리케이션 서버가 L4 Switch에 의하여 Load Balancing 되는 경우 웹 페이지 접속 시 ASP.NET 컨트롤(트리 컨트롤 같은...)에서 없던 오류가 발생하거나 이미지가 [x] 표시 되는 현상이 발생할 수 있습니다. 이 경우 Fiddler를 통하여 페이지 요청 시 WebResource.axd 요청이 실패하는지 확인합니다. 해당 요청에서 문제가 있다면 서버의 이벤트 로그에 다음과 같이 CryptographicException 오류가 발생하였는지 확인해보세요.

Event code: 3005
Event message: 처리되지 않은 예외가 발생했습니다.
Event time: 2009-10-29 오후 10:05:45
Event time (UTC): 2009-10-29 오후 1:05:45
Event ID: 28188a45397841e499de7a4c38b4f4cd
Event sequence: 61
Event occurrence: 3
Event detail code: 0
 
Application information:
    Application domain: /LM/W3SVC/1/ROOT/blog-1-129012944438577909
    Trust level: Full
    Application Virtual Path: /blog
    Application Path: D:\Web\blog\
    Machine name: MCAS02
 
Process information:
    Process ID: 4460
    Process name: w3wp.exe
    Account name: NT AUTHORITY\NETWORK SERVICE
 
Exception information:
    Exception type: CryptographicException
    Exception message: 패딩이 잘못되었으며 제거할 수 없습니다.
 
Request information:
    Request URL: http://web.hyok.kr/blog/WebResource.axd?d=9n4PyABCLnJPx4xoU3nxwC4Kt15K3u-a245UfT6hW8JSf4r6suGuS1kEScfmyvro0&t=633739595980000000
    Request path: /blog/WebResource.axd
    User host address: 166.125.33.55
    User: 
    Is authenticated: False
    Authentication Type: 
    Thread account name: NT AUTHORITY\NETWORK SERVICE
 
Thread information:
    Thread ID: 10
    Thread account name: NT AUTHORITY\NETWORK SERVICE
    Is impersonating: True
    Stack trace:    위치: System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
   위치: System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
   위치: System.Security.Cryptography.CryptoStream.FlushFinalBlock()
   위치: System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
   위치: System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType)
   위치: System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context)
   위치: System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   위치: System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
 
 
Custom event details:


[패딩이 잘못되었으며 제거할 수 없습니다. (Padding is invalid and cannot be removed.)]

이 에러는 WebResource.axd 파일을 요청할 때 발생합니다. 이 파일은 ASP.NET의 컨트롤을 사용하는 경우 요청되는데요. 이 때 암호화 작업이 발생합니다. 암호화에 사용되는 Machine Key는 서버가 가지고 있습니다. Machine Key를 설정한적이 없다면 동적으로 생성되어 사용됩니다. 서버가 한 대일 경우는 상관 없지만, 여러 대이면서 Load Balancing을 하는 경우는 문제가 발생합니다. 요청마다 서버가 바뀌므로 암호화 키를 전달해준 서버가 아닌 서버가 암호화된 정보를 받는다면 해독할 수 없고, 위 처럼 오류가 발생하는 것이지요. 중국 사람, 일본 사람과 제가 대화 한다면 일본 사람에게 중국말을 하면 안되고 일본 사람에게 중국말을 하면 안되겠죠. 아마 위 에러처럼 깜짝 놀랄 겁니다. 모두가 이해할 수 있는 통일된 변환(여기서는 암호화)이 필요합니다. 아군도 암호를 해독 못하는 이 상황은 해결이 필요하네요.

이는 모든 웹 어플리케이션 서버의 Machine Key를 동일하게 함으로 해결할 수 있습니다. 새로운 Machine Key 키 생성은 다음의 사이트에서 도움을 받으세요.

http://www.orcsweb.com/articles/aspnetmachinekey.aspx

생성된 Machine Key는 web.config에 다음의 형태로 삽입하면 됩니다.

<?xml version="1.0"?>
<configuration>
  <appSettings/>
  <connectionStrings/>
  <system.web>
    <machineKey
      alidationKey='123429A424239D13BE9B0AA06242A2984836A22AF64810C5DBC7857BED4F7D347C0F79302051DB271B44CB6D5D1EE47A1A001AD98F44A6F8162D833E2D612D0A'
      decryptionKey='ABCD2F551DB337398AA5C4654DED3889604A593F68559FED' validation='SHA1'/>
  </system.web>
</configuration>

참고 자료는 다음과 같습니다.

http://blogs.msdn.com/paraga/archive/2006/07/03/655081.aspx
http://jagbarcelo.blogspot.com/2009/08/solution-padding-invalid-cannot-be.html

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

CryptographicException: Event code 3005  (0) 2009.10.30
HTML에서 특수 기호 인코딩의 필요성  (0) 2009.08.19
단일 프로세스 실행  (0) 2008.09.04
Posted by 안혁 windfruit
TAG ASP.NET

C#(ASP.NET)
2009. 08. 19.
안혁
http://hyok.kr



HTML 문서에서 특정 의미로 해석되는 ", <, >등의 문자들을 글 내용, 글 제목 등으로 그대로 출력 시 예측하지 못한 돌발 상황에 빠지게 됩니다.
 
예를 들어,
[code]
<input value="테스트 내용" />
[/code]
이렇게 HTML 문서가 만들어질 것이라고 예상하고 코드를 작성하였는데, value 값에 "문자가 들어가서
[code]
<input value="누가 " 이런 글자를 입력해삼?" />
[/code]
이런 HTML이 되어버려 화면에 '누가'만 나와버리는 상황이 그에 해당되겠습니다.
 
이 때, 개발자가 저런 특수문자를 입력 못하게 할 수도 있겠지만...
잘 생각해보십시오. 지금도 그 특수문자라는 것을 당신은 보고 이 글을 이해하고 있지 않습니까?
보여줄 방법이 있겠군요.
막아버리면 이모티콘조차 사용할 수 없는 황량한 프로그랭이 될겁니다. ( '');;;;
 
 
이상한 문자 입력하는 것. 다 받아 주십시오.
그럼 저장할 때 뭔가 좀 해볼까요?
그런 것, 하지 마세요. 나중에 검색할 때 방해됩니다.
그냥 저장합니다.
 
그럼, 출력할 때 무언가 하는 것이겠군요.
그렇습니다.
비하인드 코드에서 문자열을 대입할 때 다음 함수를 사용하여 문자열을 인코딩합니다.
 
[code]
string encodedStr = HttpUtility.HtmlEncode(orignalStr);
 [/code]
 
혹시 이런 질문을 하는 사람이 있을지 모르겠습니다.
디코딩은 언제하나요?
안해도 됩니다. 브라우저가 해줄겁니다.
 

추신)
'문자는 인코딩 되지 않습니다. '문자로 문자열을 묶어 다음과 같은 상황이 발생하지 않도록 주의하세요.
[code]
<input value='누가 ' 이런 글자를 입력해삼?' />
[/code]
값을 넣을 때, "문자로 묶는 습관을 가지기시 바랍니다.

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

CryptographicException: Event code 3005  (0) 2009.10.30
HTML에서 특수 기호 인코딩의 필요성  (0) 2009.08.19
단일 프로세스 실행  (0) 2008.09.04
Posted by 안혁 windfruit
TAG C#

ASP.NET AJAX
.Net Framework 3.5
2008. 03. 11.
안혁
http://hyok.kr



.Net Framework 3.5를 설치했더니 기존 .Net Framework 2.0 기반 웹 어플리케이션에서 다음과 같은 에러를 발생시키나요?

(System.Web.UI.ScriptManager)이 컨트롤 형식(System.Web.UI.ScriptManager)과 호환되지 않습니다.

사용자 삽입 이미지

ASP.NET에서 ASP.NET AJAX Extension의 가장 최신 버전의 DLL을 참조하는 것 같습니다. 오류가 발생하는 해당 어플리케이션에서 참조된 System.Web.Extensions을 삭제하고 다음 경로를 직접 참조하세요.

C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\System.Web.Extensions.dll


Windows Server 2008에 ASP.NET AJAX Extension 1.0을 사용한 웹 어플리케이션을 배포하는 경우에도 동일한 에러가 발생할 수 있습니다. .Net Framework 3이 포함되어 있는 만큼 ASP.NET AJAX 기존 버전이 없을테니 ASP.NET AJAX 1.0을 설치한 후 작업하세요.

수정하고 다시 빌드 후에도 오류가 해결되지 않는다면 해당 웹 어플리케이션의 web.config에 다음을 추가하여 이전 버전을 사용하도록 설정하세요.

[code]
<configuration>
......
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
           <bindingRedirect oldVersion="3.5.0.0" newVersion="1.0.61025.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>
[/code]

'.Net > .NET AJAX Extension' 카테고리의 다른 글

.Net 3.5 설치 후 System.Web.UI.ScriptManager 오류 발생  (0) 2009.02.26
ASP.NET AJAX Note  (0) 2008.07.07
Posted by 안혁 windfruit
2008.09.04 13:41

C#
2008. 9. 4.
안혁
http://hyok.kr


참고자료:
   http://shinbinet.zc.bz/bbs/view.php?id=ccc&no=11
   http://forum.xda-developers.com/archive/index.php/t-361997.html


기본적으로 하나의 프로그램을 개속 실행하면 실행한 만큼 프로세스가 생기지만, 특별한 경우, 한 개만 실행되고 다시 실행시킬 경우 이미 실행되어 있는 프로그램이 활성화 되었으면 하는 때도 있습니다.
아쉽게도 C#에는 윈도우 활성화(최소화 되있거나 다른 윈도우에 가려졌거나 했을 때 눈에 보여지도록 하는 것을 말함)를 시켜주는 함수가 존재하지 않습니다. 그래서 WinAPI를 사용하여 이 부분을 해결합니다.

 1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern void BringWindowToTop(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern void SetForegroundWindow(IntPtr hWnd);

[System.Runtime.InteropServices.DllImport("coredll.dll")]

public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);

 

/// <summary>

/// 해당 응용 프로그램의 주 진입점입니다.

/// </summary>

[MTAThread]

static void Main()

{

    string rt = "HyokMain"; //실행파일의 Caption

 

    // 최상위화면으로

    IntPtr wHandle = FindWindow(null, rt);

    if (wHandle != IntPtr.Zero)

    {

        ShowWindow(wHandle, 5);

        BringWindowToTop(wHandle);

        SetForegroundWindow(wHandle);

    }

    else

    {

        Application.Run(new HyokAppMain());

    }

}


윈도우 어플리케이션을 생성하면 program.cs라는 파일이 생기고, 그 안에서 Main 함수가 있는 클래스를 발견할 수 있습니다. 1~8줄이 WinAPI 함수를 Import하는 부분이다. coredll.dll을 Import하는데, 이는 .Net Compact Framework를 대상으로 할 때 사용하는 dll입니다. 일반 윈도우에서 동일한 기능을 구현하고자 한다면 coredll.dll 대신 user32.dll을 기입하면 되며, 19~20줄에서 프로그램 실행 여부를 확인 후 활성화(22~24줄) 또는 실행(28줄)하게 됩니다.

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

CryptographicException: Event code 3005  (0) 2009.10.30
HTML에서 특수 기호 인코딩의 필요성  (0) 2009.08.19
단일 프로세스 실행  (0) 2008.09.04
Posted by 안혁 windfruit
TAG C#

Visual Studio 2008
2008. 8. 13.
안혁
http://hyok.kr



Visual Studio SP1이 출시되었습니다.

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=27673c47-b3b5-4c67-bd99-84e525b5ce61

설치 시 5GB의 여유공간을 필요하다고 합니다.
만약 Silverlight Tools Beta2 for VS2008이 설치되어 있다면 먼저 언인스롤이 필요하다고 합니다.
기타 설치 시 준비작업을 도와 주는 툴은 다음 주소에서 받으실 수 있습니다.

http://www.microsoft.com/downloads/details.aspx?FamilyId=A494B0E0-EB07-4FF1-A21C-A4663E456D9D&displaylang=en

'.Net > Visual Studio 2008' 카테고리의 다른 글

Visual Studio 2008 SP1 출시  (0) 2008.08.13
Linq to DataSet  (0) 2008.08.12
.Net Framework 3.5 Note  (0) 2008.06.23
Visual Studio 2008 출시 + WPF, Silverlight, AJAX ASP.NET 공식 사이트  (0) 2007.12.03
Posted by 안혁 windfruit

Visual Studio 2008
.Net Framework 3.5
LINQ
2008. 8. 12.
안혁
http://hyok.kr



.Net 3.5에서 부터 지원되는 LINQ로 DataSet에 Query를 요청하는 예.

var Query = from o in BoazGlobalValue.ApporvalDS.Tables["FolderType"].AsEnumerable()

            where o.Field<string>("folderTypeCode") == "UB"

            select o;

String Ing = Query.AsDataView()[0]["TotCnt"].ToString();


LINQ는 Enumerable 타입을 기반으로 하기 때문에 테이블에 대하여 AsEnumerable() 함수를 사용한다. 여기서 LINQ 실행결과는 AsDataView()함수를 사용하여 DataView 타입으로 변경하여 접근하면 된다. 이 함수를 쓰면 GridView의 DataSource로도 지정할 수 있다.

'.Net > Visual Studio 2008' 카테고리의 다른 글

Visual Studio 2008 SP1 출시  (0) 2008.08.13
Linq to DataSet  (0) 2008.08.12
.Net Framework 3.5 Note  (0) 2008.06.23
Visual Studio 2008 출시 + WPF, Silverlight, AJAX ASP.NET 공식 사이트  (0) 2007.12.03
Posted by 안혁 windfruit

.Net Framework 3.5
Visual Studio 2008
2008. 7. 7.
안혁
http://hyok.kr

A.
     PostBack type

                         i.         Postback

                1.      ASP.NET에서 사용하는 기본적 이벤트 처리 방식

                2.      이벤트 발생 시 열려진 페이지에 대하여 재 요청이 일어나는데 이를 말함

                        ii.         Cross Page PostBack

                1.      SourcePage.aspx

...
<
form runat="server" >
...
<asp:textbox runat="server" id="txtFirstName"/>
<
asp:textbox runat="server" id="txtLastName"/>
<
asp:button runat="server" id="btnViewReport" Text="View Report" PostbackURL="~/targetpage.aspx" />
...


...
public
string FirstName

{

    get { return txtFirstName.Text; }

}
...

                2.      TargetPage.aspx

...
<%@ PreviousPageType VirtualPath="sourcepage.aspx" %>

...


...
string
strFirstName;
strFirstName = PreviousPage.FirstName //Strongly Typed PreviousPage allows direct access to the public properties of the source page.
...

Ø  자기 자신이 아닌 다른 페이지로 요청되는 Postback

                       iii.         Async PostBack

                1.      ASP.NET AJAX에서 지원하는 Postback

                2.      ScriptManager가 있는 페이지의 UpdatePanel 내부에서 이벤트 발생 시 Async Postback


B.
     비 동기 요청

                         i.         Background Thread를 생성하여 요청

                        ii.         클라이언트는 자신의 여러 요청 중 마지막 요청 결과만을 처리


C.
     UpdatePanel

                         i.         ASP.NET AJAX에서 Async Postback으로 처리하는 기본 영역

                        ii.         Async Postback 이벤트는 UpdatePanel 내부의 서버 컨트롤에 의해 발생

                       iii.         Async Postback의 결과는 UpdatePanel 내부만 반영

                       iv.         Trigger를 사용하여 UpdatePanel 외부 컨트롤 이벤트에 대하여 작동 지정 가능

                        v.         UpdatePanel 내부의 서버 컨트롤은 Async Postback 요청이 기본이지만, 의도적으로 Postback 요청 가능

                       vi.         UpdateMode

                1.      UpdatePanel을 갱신하는 조건 설정

                2.      자신(UpdatePanel)을 비 동기 갱신할 수 있는 범위를 제한

                3.      조건

                    A.     Conditional

Ø  공통 범위에 해당 되는 경우
(
, ChildrenAsTriggers=true일 경우에는 자기(UpdatePanel) 내부에 존재하는 자식 컨트롤까지 포함)

                    B.      Always

Ø  공통 범위 및 자신(UpdatePanel)을 포함한 모든 UpdatePanel의 자식 컨트롤

                4.      공통 범위: 조건과 관계없이 UpdatePanel을 갱신 시키는 상황

                    A.     해당 UpdatePanel Triger로 지정된 액션이 발생할 경우

                    B.      해당 UpdatePanel Update() 함수가 명시적으로 호출되는 경우

                    C.      중첩 UpdatePanel일 때, 부모 UpdatePanel이 업데이트 되는 경우


D.
     UpdatePanel 외부에서 Async PostBack 요청

                         i.         컨트롤 추가

                1.      ScriptManager

                2.      Button

                3.      UpdatePanel

                    A.     ListBox

                4.      UpdateProgress

                        ii.         UpdatePanel 속성 변경

사용자 삽입 이미지

Ø  UpdateMode는 무엇이든 상관 없음

Ø  Triggers 선택

사용자 삽입 이미지

Ø  ControlID 클릭 시 서버 컨트롤을 선택할 수 있음

                       iii.         이벤트 처리

protected void Button1_Click(object sender, EventArgs e)

{

    System.Threading.Thread.Sleep(2000);

    List<string> myList = new List<string>() { "첫번째", "두번째", "세번째" };

    ListBox1.DataSource = myList;

    ListBox1.DataBind();

}


E.
      UpdatePanel 내부에서 PostBack 요청

                         i.         컨트롤 추가

                1.      ScriptManager

                2.      ListBox

                3.      UpdatePanel

                    A.     Button

                    B.      Textbox

                        ii.         UpdatePanel 속성 변경

사용자 삽입 이미지

Ø  UpdateMode는 무엇이든 상관 없음

Ø  Triggers 선택

사용자 삽입 이미지

Ø  추가 버튼의 ▼ 클릭하여 PostBack 멤버 추가

Ø  ControlID ID를 직접 입력

                       iii.         이벤트 처리

protected void Button1_Click(object sender, EventArgs e)

{

    ListBox1.Items.Add(TextBox1.Text);

}


F.
      MasterPage 사용

                         i.         한 페이지에 하나의 ScriptManager만 존재하여야 함

Ø  MasterPage에만 ScriptManager가 있어야 함

                        ii.         MasterPage를 사용하는 웹 페이지에는 ScriptManager를 넣어서는 안됨

Ø  ScriptManager를 접근해야 한다면 ScriptManagerProxy를 이용


G.
     Timer

                         i.         일정 시간 단위로 이벤트를 발생하게 함

                        ii.         Tick 이벤트 발생

                       iii.         컨트롤 추가

                1.      ScriptManager

                2.      UpdatePanel

                    A.     Timer

                       iv.         Timer UpdatePanel 밖에 두고 Triggers에 연결(선택 진행)

Ø  UpdatePanel 안에 Timer를 두면 Triggers 연결 필요 없음

Ø  UpdateMode는 무엇이든 상관 없음

Ø  Triggers 선택

사용자 삽입 이미지

Ø  UpdateMode는 무엇이든 상관 없음

Protected void Timer1_Tick(object sender, EventArgs e)

{

    TextBox1.Text = DateTime.Now.ToLongTimeString();

}


H.
     Control Toolkit

                         i.         http://ajax.asp.net

                        ii.         닷넷 3.5 Control Toolkit 다운

                       iii.         \AjaxControlToolkit-Framework3.5\SampleWebSite\Bin

                1.      AjaxControlToolkit.dll

                2.      AjaxControlToolkit.pdb

                3.      \AjaxControlToolkit-Framework3.5\Binaries 에 복사

                       iv.         AjaxControlToolkit.sln 열기

                1.      시작 프로젝트: SampleWebSite

                2.      시작 페이지: Default.aspx

                3.      TemplateVSI 프로젝트 언 로드

                4.      실행

                        v.         도구상자에 추가

                1.      탭 추가

                2.      항목 선택

                3.      \AjaxControlToolkit-Framework3.5\Binaries\AjaxControlToolkit.dll


I.
       Library

                         i.         ScriptManager 컨트롤을 추가한 페이지에서 AJAX Library를 사용할 수 있음

Ø  또는 직접 AJAX Library 관련 js 파일을 참조하여도 됨

                        ii.         플랫폼에 독립적인 스크립트 라이브러리로 구성

Ø  다양한 플랫폼에서 Ajax를 적용할 수 있음

                       iii.         기능적 아키텍처

                1.      컴포넌트

Ø  비주얼이 없는 Components, Behaviors, Controls

                2.      브라우저 호환성

Ø  Microsoft IE, Mozilla Firefox, Apple Safari

                3.      네트워킹

Ø  비 동기 요청, XML& JSON 직렬화, Web & App 서비스

                4.      핵심 서비스

Ø  JavaScript 기본 클래스 확장, Type 시스템, 이벤트, 직렬화

Ø  $get(): document.getElementById()


J.
       웹 서비스 요청

                         i.         자바 스크립트에서 웹 서비스를 호출 할 수 있도록 지원

                        ii.         같은 도메인의 웹 서비스만 호출할 수 있듬

                       iii.         호출되는 웹 서비스는 ScriptService 사용하여 이를 지원

                       iv.         웹 서비스 생성: MyOrder.asmx

[System.Web.Script.Services.ScriptService]

public class MyOrder : System.Web.Services.WebService {

[WebMethod]

    public OrderType getOrder(int OrderID)

    {

        SqlConnection con = new SqlConnection();

        con.ConnectionString =

            @"data source=localhost\sqlexpress;initial catalog=Northwind;integrated security=true";

        string sql = "select CustomerID, EmployeeID, OrderDate from Orders where OrderID = " + OrderID;

        SqlCommand cmd = con.CreateCommand();

        cmd.CommandText = sql;

        SqlDataAdapter adt = new SqlDataAdapter();

        adt.SelectCommand = cmd;

        DataSet ds = new DataSet();

        adt.Fill(ds);


        OrderType obj = new OrderType();

        if (ds.Tables[0].Rows.Count > 0)

        {

            obj.CustomerID = ds.Tables[0].Rows[0]["CustomerID"].ToString();

            obj.EmployeeID = ds.Tables[0].Rows[0]["EmployeeID"].ToString();

            obj.OrderDate = ds.Tables[0].Rows[0]["OrderDate"].ToString();

        }

        return obj;

    }

}


public class OrderType

{

    public string CustomerID { get; set; }

    public string EmployeeID { get; set; }

    public string OrderDate { get; set; }

}

                        v.         호출 페이지에 컨트롤 추가

                1.      ScriptManager

                2.      Text 4

                3.      Input (Button)

                웹 서비스 호출 페이지의 ScriptManager에 웹 서비스 연결(Services 선택)

사용자 삽입 이미지

                       vi.         자바 스크립트에서 웹 서비스 호출

// 이 함수를 버튼 클릭에 연결

function Button1_onclick() {

    // <네임 스페이스 이름>.<클래스 이름>.<함수 이름>(……)

// (……): ([인자,] <성공 콜백 함수>[, <실패 콜백 함수>[, <콜백 함수에 전달 값>]])

    WebService1.MyOrder.getOrder($get("Text1").value, onSuccess, onException);

}


// 성공 시 호출

// <콜백 함수>(<반환 값>[, <전달 값>[, <호출 함수 이름>]])

function onSuccess(result) {

    $get("Text2").value = result.CustomerID;

    $get("Text3").value = result.EmployeeID;

    $get("Text4").value = result.OrderDate;

}


// 실패 시 호출

function onException(args) {

    alert(args.get_message());

}

Ø  웹 서비스 호출 시 웹 서비스의 네임 스페이스(WebService1)와 클래스 이름(MyOrder)을 확인하고 실제와 다르다면 변경할 것


K.
     페이지 메서드

                         i.         비하인드 코드에 있는 함수를 자바 스크립트에서 호출 지원

                        ii.         코드 비하인드 클래스를 통해 노출되는 정적 메서드

                       iii.         해당 페이지 함수 호출만 가능

                       iv.         필수 사항

                1.      WebMethod 어트리뷰트 사용

                2.      public static 매서드

[WebMethod]

public static string Greeting()

{

    return "Wow!";

}

                3.      ScriptManager.EnablePageMethods = true

사용자 삽입 이미지

                4.      호출 시 PageMethods 프록시 개체 사용

function Button1_onclick() {

    PageMethods.Greeting(onSuccess);

}


function onSuccess(result) {

    alert(result);

}


L.
      Event Life Cycle

                         i.         Sample

……

<div>

    <asp:ScriptManager ID="ScriptManager1" runat="server" />

</div>


<script type="text/javascript">

// 다음 설정은 ScriptManager 선언 이후에 이루어져야 함-------------//

var smg = Sys.WebForms.PageRequestManager.getInstance();

smg.add_initializeRequest(init);

smg.add_beginRequest(begin);

smg.add_pageLoading(loading);

smg.add_pageLoaded(loaded);

smg.add_endRequest(end);

//-----------------------------------------------------------------------------//


function init(sender, args) {

    alert("init");

}


function begin(sender, args) {

    alert("begin");

}


function loading(sender, args) {

    alert("loading");

}


function loaded(sender, args) {

    alert("loaded");

}


function end(sender, args) {

    alert("end");

}

</script>

……

Ø  웹 서비스 또는 패이지 메서드로는 확인할 수 없음

Ø  Async Postback를 발생 시켜야 함(서버 컨트롤 사용)

                        ii.         이중 요청 방지

var mrg = null;


// 비 동기 요청 완료마다 자동 호출 됨

function pageLoad() {

    mrg = Sys.WebForms.PageRequestManager.getInstance();

    mrg.add_initializeRequest(init);

}


function init(sender, args) {

    // 요청 발생 컨트롤 비활성화

    $get(args.get_postBackElement().id).disabled = true;

    if(mrg.get_isInAsyncPostBack() == true) {

        args.set_cancel(true);

    }

}

                       iii.         Exception 처리

var mrg = null;


function pageLoad() {

    mrg = Sys.WebForms.PageRequestManager.getInstance();

    mrg.add_endRequest(end)

}


function end(sender, args) {

    if(args.get_error() != null)

    {

        $get("TextBox1").value = args.get_error().description;

        args.set_errorHandled(true); // 익스플로어 에러 창 방지

    }

}

M.    자바 스크립트 리소스

                         i.         클래스 라이브러리 프로젝트 추가(ClassLibrary1)

                        ii.         자바 스크립트 파일 추가(MyScript.js)

                       iii.         System.Web 참조 추가 / 추가 스크립트 파일 속성 변경

사용자 삽입 이미지


function addTo(i, j) {

    return i + j + 100;

}

                       iv.         AssemblyInfo.cs 수정

사용자 삽입 이미지
 


……

using System.Web.UI;

……

[assembly: WebResource("ClassLibrary1.MyScript.js", "text/javascript")]

……

Ø  WebResource(<네임 스페이스.파일 이름>, <파일 타입>)

                        v.         추가한 클래스 라이브러리를 호출 페이지가 있는 프로젝트에 참조 추가

                       vi.         호출 페이지 ScriptManager 수정

사용자 삽입 이미지

Ø  Assembly: 어셈블리 이름

Ø  Name: 네임 스페이스.파일 이름

                      vii.         스크립트 호출

function pageLoad() {

    alert(addTo(3,5));

}

N.    WCF 호출

                         i.         추가 - 템플릿: AJAX 사용 WCF 서비스’ 사용

[ServiceContract(Namespace = "")]

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

public class Service1

{

           [OperationContract]

           public int addTo(int i, int j)

           {

            return i + j;

           }

}

Ø  “” – 네임 스페이스, 입력하지 않으면 호출 시 네임 스페이스 불필요

                        ii.         호출은 웹 서비스와 동일

                1.      네임 스페이스를 비워두었다면 <클래스 이름>.<함수 이름>()으로 호출

Ø  Service1.addTo(3, 5, onSuccess);

                2.      네임 스페이스를 기재하면 <네임 스페이스>.<클래스 이름>.<함수 이름>()으로 호출

Ø  Test.Service1.addTo(3. 5, onSuccess);

                       iii.         Exception 처리

 [ServiceContract(Namespace = "")]

// 자바 스크립트에서 Exception 처리 시 필요

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

public class Service

{

    ……

}

Ø  자바 스크립트에서 Exception 결과를 받아 처리를 원할 경우 구문 추가

Ø  웹 서비스 호출과는 달리 허용할 때 결과를 받을 수 있음

'.Net > .NET AJAX Extension' 카테고리의 다른 글

.Net 3.5 설치 후 System.Web.UI.ScriptManager 오류 발생  (0) 2009.02.26
ASP.NET AJAX Note  (0) 2008.07.07
Posted by 안혁 windfruit
.Net Framework 3.5
Visual Studio 2008
2008. 6. 23.
안혁
http://hyok.kr


A.     코드 조각 사용

       i.         Ctrl + k, x

      ii.         Visual C# 선택

사용자 삽입 이미지

     iii.         코드 조각 선택

사용자 삽입 이미지

     iv.         TAB 키를 사용하여 수정

사용자 삽입 이미지

      v.         코드 조각 이름을 직접 입력 후 TAB 키를 눌러도 동일한 기능 작동

B.     Auto Property

       i.         프로퍼티가 단순히 값을 넣고 가져오는 작업만 하도록 하는 기능을 다음과 같이 정의

public string Name { get; set; }

public int Age { get; set; }

Ø  get, set을 정의하지 않음

      ii.         컴파일 시 각각에 연결될 변수가 자동으로 생성 à private 변수 필요 없음

     iii.         사용 예

Customer obj = new Customer() { Name = "홍길동", Age = 10 };

Ø  Customer 클래스의 프로퍼티를 위와 같이 초기화

C.     확장 메소드

static class MyClass

{

    // staticthis를 사용하여 Extension Method를 구성

    // this 다음에 나오는 타입(string)를 대상으로 확장

    // 인자를 받고 싶다면 그 다음에 넣으면 됨(int num)

    // 다음은 string 타입에 Greeting 멤버 함수를 추가

    public static string Greeting(this string str, int num)

    {

        return str + "안녕하세요" + num.ToString();

    }


    // 다음은 string 타입에 인자가 없는 IsEmailCheck 멤버 함수를 추가

    // string 변수가 가지고 있는 값이 Email 주소인지를 체크

    public static bool IsEmailCheck(this string str)

    {

        Regex reg = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");

        return reg.IsMatch(str);

    }

}


// string 타입에 추가된 멤버 함수는 다음과 같이 사용할 수 있음

private void button1_Click(object sender, EventArgs e)

{

    string str = "홍길동";

    MessageBox.Show(str.Greeting(123));

}


private void button2_Click(object sender, EventArgs e)

{

    string str = textBox1.Text;

    if (str.IsEmailCheck())

MessageBox.Show("OK");

    else

MessageBox.Show("Error");

}

D.     익명 타입

       i.         var

      ii.         자바 스크립트와는 달리 타입이 한 번 정하여지면 변경할 수 없음

     iii.         Lamda Expression의 기반 기술로 사용 됨

E.      Lamda Expression

       i.         LINQ의 기반 기술

      ii.         익명 타입을 사용

Private void button2_Click(object sender, EventArgs e)

{

    List<Customer> myCustomer = GetCustomerList();

    //c는 익명 타입

    //myCustomer의 값 중 하나가 c에 대입하여 이를 사용

    IEnumerable<Customer> ie = myCustomer.Where(c => c.City == "서울");

    //위를 다음과 같이 익명 함수를 사용하여 작성할 수 있음

    //IEnumerable<Customer> ie = myCustomer.Where(

    //    delegate(Customer c)

    //    {

    //        return (c.City == "서울" ? true : false);

    //    }

    //);


    foreach (Customer cs in ie)

    {

        MessageBox.Show(cs.Name);

    }

}


private void button3_Click(object sender, EventArgs e)

{

    List<Customer> myCustomer = GetCustomerList();

    double avg = myCustomer.Average(c => c.Age);

    //위와 동일한 코드

    //double avg = myCustomer.Average(

    //    delegate(Customer c)

    //    {

    //        return c.Age;

    //    }

    //);

    MessageBox.Show(avg.ToString());

}


private List<Customer> GetCustomerList()

{

    List<Customer> myCustomer = new List<Customer>();

    myCustomer.Add(new Customer() { Name = "홍길동", Age = 10, City = "서울" });

    myCustomer.Add(new Customer() { Name = "김길덩", Age = 20, City = "부산" });

    myCustomer.Add(new Customer() { Name = "안길둥", Age = 30, City = "대구" });

    myCustomer.Add(new Customer() { Name = "원갈동", Age = 40, City = "광주" });

    myCustomer.Add(new Customer() { Name = "문걸동", Age = 50, City = "서울" });

    myCustomer.Add(new Customer() { Name = "조골동", Age = 60, City = "서울" });

    return myCustomer;

}

F.      LINQ

       i.         List<> 타입을 이용한 LINQ

private void button1_Click(object sender, EventArgs e)

{

    List<MyClass> product = new List<MyClass>();

    product.Add(new MyClass() { Product = "컴퓨터", Price = 1000, EA = 3 });

    product.Add(new MyClass() { Product = "마우스", Price = 4000, EA = 30 });

    product.Add(new MyClass() { Product = "키보드", Price = 100, EA = 10 });

    product.Add(new MyClass() { Product = "모니터", Price = 300, EA = 5 });

    product.Add(new MyClass() { Product = "CPU", Price = 10000, EA = 44 });

    product.Add(new MyClass() { Product = "메모리", Price = 5500, EA = 2 });

    product.Add(new MyClass() { Product = "HDD", Price = 700, EA = 93 });


    // 익명 타입 대신 IEnumerable<MyClass> 타입으로 받아도 됨

    var query = from p in product

                where p.Price > 1000 && p.EA > 10

                select p;


    //foreach (MyClass mc in query)

    //{

    //    MessageBox.Show(mc.Product);

    //}


    // query IEnumerable<MyClass> 타입이므로 ToList()하지 않아도 됨

    dataGridView1.DataSource = query //.ToList();

}

      ii.         SQL 2005을 이용한 Linq

1.      SQL Management Studio 설치

A.     Visual Studio 2008을 설치할 경우 SQL Server Express 버전이 설치됨

B.      추가적으로 SQL Server를 설치하지 않고 이를 활용 가능

C.      SQL Server Express 버전은 Management Studio를 별도로 설치하여야 함

D.     SQL Management Studio 설치

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796

E.      설치된 Management Studio를 사용하여 SQL Server Express 버전 접속 시 다음을 유의

사용자 삽입 이미지

Ø  서버 이름 : localhost\sqlexpress

F.      SQL 2000 Sample DB 설치

http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en

Ø  설치 폴더 - “C:\SQL Server 2000 Sample Databases”NORTHWND/PUBSManagement Studio에서 추가

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

Ø  두 파일에 대하여 진행할 것

2.      Visual Studio 프로젝트 생성

A.     새 웹 프로젝트 생성

B.      새 항목: LINQ To SQL 추가

C.      데이터베이스 연결 추가

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

                                  i.         서버: localhost\sqlexpress ß Express 버전은 이런 방식으로 접근

Ø  정확히 입력하여야 데이터베이스를 선택할 수 있음

                                 ii.         데이터베이스: Northwind

D.     테이블 Drag&Drop: Orders

사용자 삽입 이미지

E.      컨트롤 추가

                                  i.         TextBox

                                 ii.         Button

                                iii.         GridView

                                iv.         LinqDataSource

사용자 삽입 이미지

F.      LinqDataSource 설정

사용자 삽입 이미지

사용자 삽입 이미지

Ø  DataContext 개체는 컴파일 후에 보일 것임

사용자 삽입 이미지

Ø  컬럼 선택 후 ‘Where’ 버튼 선택

사용자 삽입 이미지

Ø  추가 버튼 클릭 시 미리 보기에 추가 됨

G.     DataBinding

Ø  버튼 Click 이벤트에 다음 코드 추가

protected void Button1_Click(object sender, EventArgs e)

{

    GridView1.DataSource = LinqDataSource1;

    GridView1.DataBind();

}

H.     실행하여 버튼을 클릭하면 다음의 형태로 결과를 가져옴

사용자 삽입 이미지

'.Net > Visual Studio 2008' 카테고리의 다른 글

Visual Studio 2008 SP1 출시  (0) 2008.08.13
Linq to DataSet  (0) 2008.08.12
.Net Framework 3.5 Note  (0) 2008.06.23
Visual Studio 2008 출시 + WPF, Silverlight, AJAX ASP.NET 공식 사이트  (0) 2007.12.03
Posted by 안혁 windfruit

Visual Studio 2008
WPF
Silverlight
ASP.NET AJAX
2007. 12. 3.
안혁
http://hyok.kr


Visual Studio 2008이 출시되었습니다.
아래 링크를 따라가면 다운 받을 수 있습니다.
무료버전인 Express Edition과
Trial 버전이 있습니다.
모든 기능을 사용하고 싶다면 Trial 버전을 사용해보시는 것이 좋겠습니다.

http://msdn2.microsoft.com/ko-kr/vstudio/default.aspx

.Net 3.5 Framework 사용
ASP.NET AJAX 포함
LINQ 추가

등의 중요한 변경 사항이 있습니다.
MS 최신 프로그래밍에 관심이 있으신 분들은 참고 하시기 바랍니다.


윈도우 프로그래밍에서는 WPF
웹 프로그래밍에서는 Silverlight와 ASP.NET AJAX가
현재 최신 .Net 프로그래밍의 중요 포인트라 할 수 있겠습니다.
아래 사이트로 참고 하세요.MS 공식 사이트입니다.

WPF : http://windowsclient.net
Silverlight : http://silverlight.net
ASP.NET AJAX : http://ajax.asp.net

'.Net > Visual Studio 2008' 카테고리의 다른 글

Visual Studio 2008 SP1 출시  (0) 2008.08.13
Linq to DataSet  (0) 2008.08.12
.Net Framework 3.5 Note  (0) 2008.06.23
Visual Studio 2008 출시 + WPF, Silverlight, AJAX ASP.NET 공식 사이트  (0) 2007.12.03
Posted by 안혁 windfruit

Visual Studio 2005
2007. 11. 2.
안혁
http://hyok.kr


요즘은 서버가 64비트가 많지요? 하지만 개발자 PC는 아직 32비트가 많습니다. 더군다나 노트북이라면 더욱 그렇지요. 개발자 PC(32bit)에 작업한 프로젝트를 서버에 올려놓은 후에 서버에서 컴파일 하게 되는 경우, 빌드 후 이벤트가 문제를 발생시킬 수 있습니다. 32비트와 64비트 윈도우에서 regsvcs, regasm, gacutil의 경로가 다르기 때문입니다.

서버와 개발자 PC에 각각 환경변수 PATH를 적절히 잡아 주면 다음에 방법을 사용하지 않으셔도 됩니다. 환경변수를 매번 잡아주지 않고도 빌드 후 이벤트가 작동되도록 하려면 다음을 빌드 후 이벤트에 추가하세요.

echo ***** 빌드 후 이벤트 시작*****
set PROCESSOR_ARCHITEW6432
if ERRORLEVEL 1 GOTO x86
if NOT ERRORLEVEL 1 GOTO x64

:x86
set GACUTIL="%ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe"
set REGSVCS="%windir%\Microsoft.NET\Framework\v2.0.50727\RegSvcs.exe"
set REGASM="%windir%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe"
GOTO end

:x64
set GACUTIL="%ProgramFiles(x86)%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe"
set REGSVCS="%windir%\Microsoft.NET\Framework64\v2.0.50727\RegSvcs.exe"
set REGASM="%windir%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe"
GOTO end

:end
echo gacutil 경로 : %GACUTIL%
echo regsvcs 경로 : %REGSVCS%
echo regasm  경로 : %REGASM%

%REGASM% "$(TargetPath)"
%GACUTIL% /i "$(TargetPath)"
%REGSVCS% /u "$(TargetFileName)"
%REGSVCS% "$(TargetPath)"


검은 글씨는 프로젝트에 따라서 변경되는 부분이겠습니다. regasm, regsvcs, gacutil 명령어 대신 %REGASM%, %GACUTIL%, %REGSVCS%를 사용하면 됩니다.
Posted by 안혁 windfruit
이전버튼 1 2 이전버튼