FormCollection


--------------------------------------------------------------------

[HttpPost]

public ActionResult Create()

{

if(ModelState.IsValid)

{

Employee employee =new

UpdateModel(employee);



EmployeeBusinessLayer employeeBusinessLayer

mployeeBusinessLayer.AddEmployee(employee);


return RedirectToAction("Index");



[HttpPost]

[ActionName("Create")] -> 이렇게 선언해놓으면 Create 하면 아래 함수로 호출됨

public ActionResult Create_Post()

{

if(ModelState.IsValid)

{

Employee employee =new

UpdateModel(employee); //아래 설명



EmployeeBusinessLayer employeeBusinessLayer

mployeeBusinessLayer.AddEmployee(employee);


return RedirectToAction("Index");



[HttpPost]

[ActionName("Create")] -> 이렇게 선언해놓으면 Create 하면 아래 함수로 호출됨

public ActionResult Create_Get()

{

return View();

}




UpdateModel 함수

inspects all the HttpRequest inputs such as posted Form data, QueryString, Cookies, Server Variables and populate the employee object.


--------------------------------------------------------------------

UpdateModel and TryUpdateModel 차이점






--------------------------------------------------------------------

Nuget Package Manager에서

Entity Framework 설치

그리고 소스에서

using System.ComponentsModel.DataAnnotations; 추가


생성자에서 각 속성값 위에

[Required] 추가해줌


그리고

컨트롤러 public ActionResult Create_Post() 함수에서

Employee employee = new Employee();

TryUpdateModel(employee); //함수로 변경 


결과 입력Form 양식에서 

validation check가 됨


그러나 결론은 

UpdateModel(), TryUpdateModel() 함수 둘다 mandatory 아님

그래도 명시적으로 해주는 이유는

If you want to limit on what can be bound,

expllicitly invoking model binding can be very useful.


--------------------------------------------------------------------

Edit


[HttpGet]

public ActionResult Edit(int id)


new employeeBusinessLayer

employee = employeeBusinessLayer.Employees.Single(emp => emp.ID == id);

return View(employee);

그리고 우측키 눌러서 Add View

Model Class 선택

그리고 제공해주는 템플릿 선택 Scaffold template "Edit" 선택

--------------------------------------------------------------------

[HttpPost]

public ActionResult Edit함수 추가

비지니스레이어에 mod함수 추가



--------------------------------------------------------------------

기존 Html Helper

@Html.EditorFor(model => model.Name)

@Html.ValidationMessageFor(model => model.Name)

-> 태그로 변경되면 input 박스


UnEditorble로 변경

@Html.DisplayFor(model => model.Name)

@Html.ValidationMessageFor(model => model.Name)

-> 그냥 plain text로 render됨


수정누르면 field is required로 나옴

히든필드에 저장해놓으면 됨

@Html.DisplayFor(model => model.Name)

@Html.HiddenFor(model => model.Name)

@Html.ValidationMessageFor(model => model.Name)


--------------------------------------------------------------------

피들러 이용해서 (일종의 해킹)

POST 요청 보내어 데이터 수정이 그낭함

피들러 왼쪽 리스트에서 해당 요청건을 오른쪽 영역 Composer로 드래그 드랍

그리고 아래쪽 POST URL에서 수정하고 싶은 값을 고쳐서 Excute하면

실제로 서버로 POST 요청이 들어감 



--------------------------------------------------------------------




--------------------------------------------------------------------




1. Model State
모델 스테이트(Model State)= 모델 스테이트 딕셔너리

유효성 에러 표시 용도

혹은 이렇게 체크

if(ModelState.IsValid)

{

Employee employee =new

UpdateModel(employee);



EmployeeBusinessLayer employeeBusinessLayer

mployeeBusinessLayer.AddEmployee(employee);


return RedirectToAction("Index");

}

유효성 검사중에 이 프로퍼티들에서 fail이 나면 model state dictionary(컨트롤러 클래스의 ModelState를 의미하는)에 추가가됩니다.

model state에 에러가 있으면 ModelState.IsVaild 는 false를 반환합니다. 이같은 경우, 전화번호를 추가하는 HTML 페이지는 다시 그려지게됩니다. 그렇지 않으면, 즉, 에러가 없을 경우는 디비에 저장이 됩니다.

2. Validation 도우미 2개

1) Html.ValidationSummary() 도우미 

HTML폼 위에서 바로 호출이 됩니다. 그리고선 불릿(bulleted) 리스트로 에러 메시지를 보여줍니다.

2) Html.ValidationMessage() 도우미

각각의 HTML 폼 필드 옆에 호출이 됩니다. 에러를 해당 필드 바로 옆에 표시해주는거죠. 에러가 난 부분에도 같은 에러메시지가 표시되는 것을 확인할수 있습니다.


이 두 메쏘드는 ASP.NET MVC 스카폴딩에 의해 자동적으로 Create와 Edit 뷰에서 사용이됩니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Validation1.Models.TelDir>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
 Create
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Create</h2>
    <%= Html.ValidationSummary() %>
    <% using (Html.BeginForm()) {%>
        <fieldset>
            <legend>Fields</legend> 
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Name) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Name) %>
                <%= Html.ValidationMessageFor(model => model.Name) %>
            </div>
            
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Phone) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Phone) %>
                <%= Html.ValidationMessageFor(model => model.Phone) %>
            </div>
            
            <div class="editor-label">
                <%= Html.LabelFor(model => model.SpeedDial) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.SpeedDial) %>
                <%= Html.ValidationMessageFor(model => model.SpeedDial) %>
            </div>
            
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    <% } %>
    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>
</asp:Content>


다음은 유효하지 않은 값을 summit 했을때의 화면입니다.


3. PreBinding / PostBinding


1) HTML 폼 필드들이 클래스에 바운드 되기 전에 에러를 주는 PreBinding 에러

2) HTML 폼 필드들이 바운드 된 후에 에러를 주는 PostBinding 에러

Create()  액션은 다음과 같이 TelDir 클래스의 인스턴스를 받도록 되어있습니다.

public ActionResult Create([Bind(Exclude="Id")] TelDir dir)

summit을 하게되면 모델 바인더에 의해 HTML 폼 필드들의 값이 dir 로 바운드됩니다. 폼 필드값을 바운드 하지 못하면 자동적으로 디폴트 모델 바인더에 에러 메시지를 추가합니다.

예를들어, 디폴트 모델 바인더는 TelDir 클래스의 SpeedDial 속성에 'speed' 문자를 바운드 할 수 없습니다. decimal 타입에 string 이라니. 말이 안되죠. 그래서, 모델 바인더는 모델 스테이트에 에러를 추가합니다. 저희가 유효성 검사를 하지 않은 필드도 검사를 하는거죠.













https://www.youtube.com/watch?v=KvTy_FAYjks&index=3&list=PL6n9fhu94yhVm6S8I2xd6nYz2ZORd7X2v


------------------------------------------------------ ------------------------------------------------------ 

runtime using code 확인


컨트롤러.cs 에서

Index()함수 안에서 아래 구문 넣어서 확인

그리고 웹페이지 Index 확인


return typeof(Controller).Assembly.GetName().Version.ToString();



뷰엔진 (ASPX, Razor)


비쥬얼스튜디오

우측 프로젝트 최상위 우측키 클릭

web 탭에서 어디서 퍼블리싱 할 것인지 선택가능(Visual Studio or IIS) 

IIs 선택하고 create Virtual Directory 선택하면 자동으로 생성됨


http://localhost/MVCDemo/Home/Index

       Server    Project 컨트롤러 Index함수


= http://localhost/MVCDemo


MVC URL        = 컨트롤러의 액션 메소드를 매핑

일반 웹폼 URL  = 물리적인 파일 매핑



------------------------------------------------------------------------------------------------ ------------

3강


global.asax

URL 매핑

컨트롤러Home  엑션 index 페이지 매핑해주는 함수호출

Routeconfig.cs


---------------------------------------------------------------------------------------------- --------------

기존 QueryString 방식 

호긍 

localhost/MVCDemo/home/index/10  형태로 넘길수도 있음


둘다 Index(string id, string name)  형태로 받아 사용가능

return "ID = " + id + " Name =" + name;


GET/POST 모두 가능




------------------------------------------------------ 

view

컨트롤러 해당 함수에서 우측키 뷰페이지 생성


public ActionResult Index()

{

.,..

..

return View();

}


public ViewResult Index()

{

.,..

..

return View();

}


public ViewResult Index()

{

//ViewBag 객체한테 넘겨준다

//동적 프로퍼티에 넣어준다.

ViewBag.Countries = new List<string>();

{

"India", "US", "Korea"

};


return View();

}


ViewBag.동적


cshtml = Razor

cshtml에서 닷넷 코드를 쓰려면 @ 골뱅이


<ul>

//똑같은 프로퍼티 명으로 받아야됨

@foreach(string strCountry in ViewBag.Countries)

{

<li>@strCountry </li>

}

</ul>


--------------------------------------------------------------------------------------------------- --------- 

ViewBag, ViewData is mechanism to pass data from controller to view.


controller -> view 


ViewData["aaa"] = "bbb";

ViewBag.aaa = "bbb";



---------------------------------------------------------------------------------------------------- -------- 

Model


view 페이지 최상단 import

@model MVCDemo.Models.Employee 



컨트롤러 함수 마지막

View(employee) 넘겨줘야됨



------------------------------------------------------------------------------------------------- ----------- 

1. 인스톨 엔티티 프레임워크 by using nuget package manager

2. Add EmployeeContext.cs class 모델폴더에 추가

3. Add 연결문자열 to web.config 


VS에서 Manage Package Manager 선택

엔티티프레임워크 선택 추가



----------------------------------------------------------------------- ------------------------------------- 

테이블 읽어오도록 수정


@foreach(Department department in @Model)

{

<li>

@Html.ActionLink(department.Name, "Index", "Employee", new{ departmentId = department.ID }, null)

//                        인자,     ,,,       컨트롤러명

</li>

}


EmplyeeController 안에 인자받는 클래스 생성

public ActionResult Index(int deptId)

{


List<Employee> employees = employeeContext.Employees.Where(emp = emp.DepartmentId == deptId).ToList();


}


----------------------------------------------------------------------------------------- ------------------- 

마지막 BackToList 시 에러

@Html.ActionLink("Back to List","Index" ) =>@Html.ActionLink("Back to List","Index", new{ departmentId = @Model.DepartmentId})  )




Index(int deptId) 였는데


------------------------------------------------------------------------------------------- ----------------- 








   

   

Windows Server 2012에서는 더 이상 tsconfig.msc를 지원하지 않습니다.

대신 로컬 그룹 정책 편집기(gpedit.msc) 와 registry 수정을 통해 원격 데스크톱 연결 제한을 해제할 수 있습니다.

  • 로컬 그룹 정책 편집기에서 원격 데스크톱 세션 연결 제한 해제
  • 로컬 그룹 정책 편집기를 실행 (윈도우 키 + R을 누른 다음, gpedit.msc를 입력)
  • 컴퓨터 구성 – 관리 템플릿 – Windows 구성 요소 – 터미널 서비스 – 원격 데스크톱 세션 호스트 – 연결
    원격 데스크톱 서비스 사용자를 하나의 원격 데스크톱 서비스 세션으로 제한
    을 사용 안 함으로 설정

       

  •    

       

    레지스트리를 수정하여 원격 데스크톱 세션 연결 제한 해제

  • HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server
    fSingleSessionPerUser 값을 0으로 변경 (기본값은 1 )

       




   

   

L2 스위치, L3 스위치, L4 스위치는 OSI7 layer 어느 layer에서 수행되는가에 따라 결정

   

L2 스위치

2Layer(Datalink Layer) 프로토콜인 이더넷, 프레임릴레이, ATM 등에서 스위칭 기능을 수행한다.

MAC Address

   

L3 스위치

3Layer(L3: Network layer) 프로토콜인 IP, IPX등에서 스위칭 기능을 수행하여, 라우팅 기능을 스위치가 가지게 된다.

IP Address

   

L4 스위치

4Layer(L4: Transport Layer) 프로토콜인 TCP, UDP등을 스위칭하며, 이때 TCP UDP 그리고 RTP(Real Time Protocol) 등의 헤더를 사용하여, FTP, HTTP, TFTP. SMTP 등의 프로토콜 어느 것에 대한 요구가 우선하는지 파악한 스위칭하게 된다주로 서버나 네트웍의 트래픽을 LoadBalancing하는데 이용된다.

   

L7스위치 

패킷의 헤더정보만 확인하는 L4 비해 payload(e-mail제목/내용의 문자열, HTTP컨텐츠URL, FTP파일 제목, SSL ID, Cookie 정보, 특정 바이러스(e.g. CodeRed, Nimda)패턴등을 분석해 Packet 처리하므로, 보안에 이용되어지는데 보다 높은 수준의 Intelligence 갖춘 스위치일수록 정교한 패킷의 부하분산(Load Ballancing) Qos기능 구현이 가능함.

1) Dos/SYN Attack 대한 방어

2) CodeRed/Nimda 바이러스 감염 패킷의 필터링

3) 네트워크 자원의 독점 방지를 통한 네트워크 시스템의 보안성 강화가 가능함.

   

   




   

   

   

ISAPI 필터란 (Internet Server Application Program Interface)?

인터넷 서버 응용 프로그래밍 인터페이스

ISAPI 필터는 인터넷 정보 서버의 앞단에 위치하면서 인터넷 정보 서버로 들어온 모든 request 에 대해 가장 먼저 처리할 권한과, 인터넷 정보가 생성한 response를 클라이언트에 보내주기전에 가공할 수 있는 권한을 갖는다.

ISAPI 필터를 작성할 대 잊지 말아야 할 것은 가능한 최소한의 작업을 이곳에서 처리해야 한다는 사실이다. 웹 사이트에 대한(가상 디렉토리가 아닌 웹 사이트 전체이다) 모든 request가 ISAPI 필터를 거칠 수 있기 때문에 과도한 작업을 필터에 걸어주게 되면 웹 사이트 전체의 퍼포먼스에 심각한 영향을 미치게 된다.

   

ISAPI는 CGI 보다 더 빠르게 실행되는 웹서버 프로그램을 작성할 수 있도록 해주는 일련의 윈도우 프로그램 호출이다. CGI 프로그램의 단점은 매번 실행될 때마다 그것의 고유의 주소공간과 함께 별개의 프로세스로 실행된다는 것인데, 특히 많은 사용자들을 위해 수많은 인스턴스들이 실행되는 경우 가외의 명령어들이 실행되는 결과를 낳는다. 이제 사용자들은 ISAPI를 사용하여 HTTP 프로그램의 프로세스와 주소공간의 일부로서 동작할 수 있는 DLL 프로그램 파일을 만들 수 있다. DLL 파일들은 HTTP 시작되면 컴퓨터 내에 적재되며, 필요한 동안 계속 남아있게 되므로, CGI 프로그램처럼 자주 찾아 메모리 내로 읽어들일 필요가 없게 된다.

기존의 CGI 프로그램들은 로직을 재작성하지 않고도 ISAPI를 이용한 DLL로 변환될 수 있다. 그러나, 스레드를 지원함으로써 한개의 DLL 인스턴스가 여러명의 사용자들을 지원할 수 있도록 재작성 될 필요는 있다.

ISAPI DLL 의 특별한 종류를 ISAPI 필터라고 부르는데, 이것은 모든 HTTP 요청을 위해 제어권을 받도록 지정될 수 있다. 이외에도 사용자는 암호화/복호화, 기록유지관리, 요구심사 또는 기타 다른 여러가지 목적을 위한 ISAPI 필터를 제작 할 수 있다.

   

ISAPI 필터의 동작 원리

   

ISAPI 필터는 웹 서비스가 시작될 때 인터넷 정보 서버와 같은 프로세스 공간에 로딩되는데, 이 때 ISAPI 필터는 자신이 처리할 이벤트 정보를 인터넷 정보 서버에 알려준다. 클라이언트로부터 request 가 들어오고 response를 전송할 때 인터넷 정보 서비스는 ISAPI 필터가 등록한 이벤트 정보를 사용해 각각의 필터에 특정 이벤트가 발생하였음을 알려주고, ISAPI 필터는 이벤트 핸들러에서 원하는 처리를 한다.

   

1. 웹 서비스가 시작 될 때 ISAPI 필터는 자신이 처리할 이벤트를 인터넷 정보 서버에게 알린다.

2. 클라이언트로부터 request 가 들어왔을 때 인터넷 정보 서버는 request 와 관련된 이벤트를 알려줄 ISAPI 필터가 있는지 확인하고 ,그러한 필터가 존재한다면 request 에 대한 정보를 ISAPI 필터에게 전달한다.

3. ISAPI 필터는 이벤트 핸들러에서 request 에 대한 작업을 수행하고 제어권을 다시 인터넷 정보 서버로 넘긴다.

4. 인터넷 정보 서버는 response를 생성한 후 response와 관련된 이벤트를 알려줄 ISAPI 필터가 존재하는지 확인하고, 그러한 필터가 있으면 response 에 대한 정보를 ISAPI 필터에게 전달한다.

5. ISAPI 필터는 이벤트 핸들러에서 response 에 대한 작업을 수행하고 response 를 클라이언트에게 전달한다.

   

이러한 과정을 수행하면서 인터넷 정보서버와 ISAPI 필터는 HFC(HTTP_FILTER_CONTEXT)라는 구조체를 사용해 상호간에 정보를 교환한다.

   

인터넷 서버 응용프로그램 인터페이스

즉, OWA, EAS, RPC over HTTP, ASP.NET ISAPI 등의 것을 모두 아우른다

모두 사용자에게 다양한 HTTP기반 프로토콜을 통해 Exchange 서버로의 액세스를 제공한다.

즉, 가상사설망(VPN)없이도 일반 HTTP를 통해 연결이 가능하도록 해준다.

RPC over HTTP는 VPN없이도 Exchange서버의 자신의 사서함에 ㅈ접근하도록 해준다.







윈도우 net use 명령어로 공유 폴더에 접근하기

 

NET USE

[장치 이름 | *] [\\컴퓨터 이름\공유 이름[\볼륨] [암호 | *]]

        [/USER:[도메인 이름\]사용자 이름]

        [/USER:[점으로 구분된 도메인 이름\]사용자 이름]

        [/USER:[사용자 이름@점으로 구분된 도메인 이름]

        [/SMARTCARD]

        [/SAVECRED]

        [[/DELETE] | [/PERSISTENT:{YES | NO}]]

 

NET USE {장치 이름 | *} [암호 | *] /HOME

 

NET USE [/PERSISTENT:{YES | NO}]

 



예시) 파일 동기화.bat


@echo off

 

rem 네트워크 드라이브 연결

rem net use 로컬드라이브 \\서버\공유이름 /user:사용자 패스워드

net use Z: \\192.168.0.10\DATA /user:administrator p@ssword1!

 

echo WINSYNC 폴더동기화(로컬에서 서버로 동기화)

robocopy D:\SYNC Z:\SYNC /MIR

 

공유폴더 연결

net use Z: \\192.168.0.10\DATA /user:administrator p@ssword1!

 

공유폴더 확인

net use

새 연결 정보가 저장됩니다.

 

상태         로컬      원격                      네트워크

-----------------------------------------------------------------------------

OK           Z:        \\192.168.0.10\DATA      Microsoft Windows Network

 

공유폴더 해제

net use /delete Z:

 





 






윈도우 2012 서버 부터 관리자권한으로 실행하지 않는 경우, 심지어 메모장에서 파일 드래그 오픈이 되지 않는다.

심각하게 귀찮다.


해결책은 아래와 같다.





추가 다른 방법









문제

하이퍼V가상에서, VHDX를 복사해서 SID정보까지는 변경하였지만, 사이트를 열었을 때 

계속해서 503에러가 뜨면서, 해당 어플리케이션 풀이 죽는 현상 발생

이벤트로그 : 어플리케이션 풀 config 중에서 가상디렉터리 도메인 계정정보 중에서 passwd 컬럼을 디코드 할 수 없다는 메시지

pool config can not decode iis


참고 URL : https://blogs.msdn.microsoft.com/vijaysk/2009/03/13/caution-while-xcopying-iis-7-0-config-files/





해결방법은 아래와 같다.


윈도우 서버 IIS 에 있는 N개의 웹사이트 및 설정 및 어플리케이션 풀 설정까지 한번에 복사하기


복사할 서버에서 아래의 경로에 있는 파일을 복사합니다.

경로 : C:\Windows\System32\inetsrv\config

파일 : administration.config, applicationHost.config, redirection.config


복사할 서버에서 커맨드창을 열어 아래의 커맨드를 사용하여 2개의 XML 설정파일을 생성합니다.

aspnet_regiis -px "iisConfigurationKey" "C:\iisConfigurationKey.xml" -pri

aspnet_regiis -px "iisWasKey" "C:\iisWasKey.xml" -pri


닷넷 경로 C:\Windows\Microsoft.NET\Framework64\v4.0.30319)


위의 5개의 파일을 복사하여 새로운 서버에 복사합니다.

administration.config, applicationHost.config, redirection.config 파일은 C:\Windows\System32\inetsrv\config 로

iisConfigurationKey.xml, iisWasKey.xml 파일은 C드라이브(적당한 곳)에 복사합니다. 


저장한 다음 커맨드 창을 열어 아래의 커맨드를 사용하여 설정파일을 복원합니다.  끝

aspnet_regiis -pi "iisConfigurationKey" "C:\iisConfigurationKey.xml"

aspnet_regiis -pi "iisWasKey" "C:\iisWasKey.xml"


인터넷정보서비스를 켜보면 그대로 옮겨짐. 웹사이트 열어도 잘 됨.







'기술(MS,Web,Windows,AWS) > Web개발' 카테고리의 다른 글

[MVC] Model State, Validation도우미  (0) 2016.03.14
MVC 강의 정리  (0) 2016.03.13
HTTP Error 503. The service is unavailable.  (0) 2016.02.12
DOM 문서객체모델  (0) 2016.02.11
웹 기반 기술  (0) 2016.02.11

설명이 잘 된 수집이미지 DNS호출 구동원리

   

   

   




'기술(MS,Web,Windows,AWS) > [MS]Active Directory' 카테고리의 다른 글

AD export to 엑셀  (0) 2016.03.10
AD Active Directory 핵심 정리  (0) 2016.03.10
AD 기초3 물리적구성요소  (0) 2016.02.07
AD 기초2 논리적구성단위  (0) 2016.02.07
AD 기초1 정의,핵심  (0) 2016.02.07

+ Recent posts