나는 Empty Web Project를 만들어서, MVC를 시도하고 있다. 

index 페이지로 이동 하던 중에 ViewBag가 작동하지 않는다.

이유는 Views라는 폴더 밑에 Web.config 라는 파일을 내가 생성해주지 않았기 때문이다.


저 파일을 생성하주면 된다.


내용 Web.config 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0"?>
 
<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>
 
  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <!--<add namespace="System.Web.Optimization"/>-->
        <add namespace="System.Web.Routing" />
        <add namespace="MoccozyProject" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>
 
  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>
 
  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>
 
  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>
</configuration>
 
 
cs


Posted by Hoya0415
,

overall 

http://www.asp.net/media/4071077/aspnet-web-api-poster.pdf


formats of model Binding

http://www.asp.net/web-api/overview/formats-and-model-binding


Self Hosting

http://www.asp.net/web-api/overview/older-versions/self-host-a-web-api


About WebApiConfig Class

http://www.asp.net/web-api/overview/advanced/configuring-aspnet-web-api


Routing 

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api


Message handler

http://www.asp.net/web-api/overview/advanced/http-message-handlers


Model Validation

http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api


.NET CLIENT CALLING

http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client


WEB API NINJECTION

http://www.asp.net/web-api/overview/advanced/dependency-injection

unit testing 

http://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api


'.NET 개발 > ASP.NET Web API' 카테고리의 다른 글

Method Not Allowed 405 on IIS  (0) 2015.12.18
@ViewBag is Not Working  (0) 2015.12.07
Asp.Net Configuration Tool In Visual Studio 2013  (0) 2015.07.15
aspnetdb 생성  (0) 2015.07.14
IPrincipal 와 Identity  (0) 2015.07.14
Posted by Hoya0415
,

WebSecurity

사용자 계정을 만들고, 사용자를 로그인/로그아웃하며, 암호를 다시 설정하거나 변경하고, 관련 작업을 수행하는 등 ASP.NET 

웹 페이지 응용 프로그램에 보안 및 인증을 제공합니다.

Posted by Hoya0415
,

NamedPipeServerStream와 NamedPipeClientStream Pipe 로 연결 시 에러가 낫다.



테스트 환경에서 에러가 나지 않았는데 왜 그럴까..

구글링을 통해 찾아냈고, 먼저 찾아내신 개발자 분이 계셔서 기록을 남기게 되었다.

클라이언트쪽에서 연결시 에러가 났는데, 서버쪽 코드는 아래와 같다.

1
2
3
4
5
var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.In, numThreads);
 
var threadId = Thread.CurrentThread.ManagedThreadId;
 
pipeServer.WaitForConnection();
cs

PipeDirection.In 으로 한 이유는 서버쪽에서는 클라이언트에게 데이터를 넘길 필요가 없어서였다.

그런데 양쪽 방향으로 해줘야 연결이 된다..

1
2
3
var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads);
var threadId = Thread.CurrentThread.ManagedThreadId;
pipeServer.WaitForConnection();
cs


이건 단지 해결방법이었고, 원인은 추가적으로 올릴 기회가 있으면 올리겠습니다.~

출처 : http://adventuresindevelopment.blogspot.kr/2008/07/named-pipes-issue-systemunauthorizedacc.html

'.NET 개발 > C#' 카테고리의 다른 글

Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
WebSecurity 클래스  (0) 2015.12.03
명명된 파이프  (0) 2015.11.11
C# MailMessage 클래스로 네이버 메일 이용하기.  (0) 2015.11.10
EntityFramework 활용하기.  (0) 2015.11.09
Posted by Hoya0415
,

명명된 파이프

.NET 개발/C# 2015. 11. 11. 14:09

명명된 파이프

위키백과, 우리 모두의 백과사전.

명명된 파이프(named pipe) 또는 지명 파이프는 유닉스 및 유닉스 계열의 일반 파이프를 확장 한 것으로, 프로세스 간 통신 기법 중 하나이다. 그 개념은 마이크로소프트 윈도도 있지만, 의미는 크게 다르다. 일반 파이프는 ‘이름’이며, 사용하는 프로세스가 실행 중에만 존재한다. 명명된 파이프는 영구 프로세스가 소멸해도 계속 존재하기 때문에 사용하지 않으면 제거할 필요가 있다. 명명된 파이프 파일과 같이 취급할 수 있고 프로세스 간 통신(IPC)을 위해 프로세스가 오픈되어 사용한다. 또한 동작에서 명명된 파이프를 FIFO로 부르기도 한다.



Posted by Hoya0415
,

도구 : Visual Studio 2013 Community, MSSQL


사전 지식 준비 : 

EntityFrameWork, Email 간단한 지식


.NET에는 System.Net.Mail DLL을 제공하고 있는데 Mail을 보낼 수 있는 기능이다. 

메일을 보내려면 Mail SMTP Server가 필요하다.


EmailModel 클래스를 보면, 생성자에서 인자를 받는데 Company를 이용해서 

FromEmail에 있는 SMTP 서버와 Port를 가져올것이고 IsSSL 을 사용할지도 데이터로 미리 넣어놔서 가져올 것이다.

그리고 나머지 제목, 내용, BodyHTML 여부로 인자를 줄 것인데, 굳이.. DB를 안하겠다면 Class로 만들어서 사용해도 된다..


1. 네이버 같은 경우는 로그인 후 메일 탭으로 이동하면 제일 하단에 [환경설정] 이라는 곳이 있다. 

2. 눌러보면 [POP3/SMTP 설정] 이 있는데 눌러보면 SMTP 서버와 PORT 가 있을 것이다. 이 정보가 SMTP 서버가 될것고, 이 네이버 서버를 이용하려면 사용자 정보가 필요하다. 

NetworkCredential(fromEmail.MailID, fromEmail.Password);

인증 관련해서 객체를 넣어주는 구문인데 본인 계정을 쓰면 되겠다. ㅎ


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 public class EmailModel : IDisposable
    {
        public FromEmail fromEmail { get; set; }
        public List<ToEmail> toMails { get; set; }
        public string Header { get; set; }
        public string Body { get; set; }
        public bool IsBodyHTML { get; set; }
        public MailMessage message { get; set; }
        public SendEmailResult _result;
        public event EventHandler<SendEmailResult> EmailSendCompleted;
 
        public EmailModel(string Company, string Header, string Body, bool IsBodyHTML)
        {
            this.Header = Header;
            this.Body = Body;
            this.IsBodyHTML = IsBodyHTML;
 
            try
            {
                using (var db = new DeepViewEntities(ConnectStringBuilder.DeepViewConnectionString().ToString()))
                {
                    var fromMails = db.FromEmail.Where(email => email.Company.ToLower() == Company);
 
                    if (fromMails.Count() > 0)
                        fromEmail = fromMails.First();
                    else
                        throw new Exception("formMail에 일치하는 Company가 없습니다.");
 
                    if (fromEmail != null)
                    {
                        var toMailList = db.ToEmail.Where(tomail => tomail.ServiceID == fromEmail.ID &&
                            tomail.IsActive == true).ToList();
 
                        if (toMailList.Count > 0)
                            toMails = toMailList;
                        else
                            throw new Exception("toMail에 해당하는 유저 정보가 없습니다.");
                    }
                }
            }
            catch (Exception ex)
            {
                _result = new SendEmailResult(false, ex);
            }
 
 
        }
 
        public void MailSend()
        {
 
 
            string smtpServer = fromEmail.Smtp;
 
            message = new MailMessage();
            message.Subject = Header;
            message.Body = Body;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.Priority = MailPriority.High;
            if (IsBodyHTML)
                message.IsBodyHtml = true;
 
            toMails.ForEach(to => message.To.Add(to.MailID));
 
            // Credentials 계정이랑 From 계정이랑 동일 해야한다.
            message.From = new MailAddress(fromEmail.MailID);
 
            SmtpClient client = new SmtpClient(smtpServer);
            client.Port = fromEmail.SmtpPort;
            client.UseDefaultCredentials = true;
            client.Credentials = new NetworkCredential(fromEmail.MailID, fromEmail.Password);
 
            try
            {
                if (_result != null)
                    throw _result.Exception;
 
                client.Send(message);
            }
            catch (Exception ex)
            {
                _result = new SendEmailResult(false, ex);
                if (EmailSendCompleted != null)
                    EmailSendCompleted(this, _result);
            }
        }
 
        public void Dispose()
        {
            message.Dispose();
            GC.Collect(2);
            GC.WaitForPendingFinalizers();
        }
    }

cs




MSSQL DB


'.NET 개발 > C#' 카테고리의 다른 글

NamedPipeClientStream 에러 : System.UnauthorizedAccessException  (0) 2015.11.17
명명된 파이프  (0) 2015.11.11
EntityFramework 활용하기.  (0) 2015.11.09
인터페이스 사용 이유  (0) 2015.10.27
18.3 비동기 태스크 호출  (0) 2015.09.14
Posted by Hoya0415
,

Entity 클래스의 생성자 중에 ConnectionString 인자 값을 받을 수 있는 오버로드가 있는데 그 인자 값을 이용하여

아래의 EntityConnectionStringBuilder 를 이용하면, Entity들을 Source 단에서 설정하고 자유롭게 이동할 수 있다. 

다만, Entity의 Model을 매칭시켜줘야 한다.^^


EntityConnectionStringBuilder - EntityClient에서 사용하는 연결 문자열의 내용을 손쉽게 만들고 관리할 수 있는 방법을 제공합니다.

 속성 

   Provider : 연결 문자열의 내부 .NET Framework 데이터 공급자 이름을 가져오거나 설정합니다.

   ProviderConnectionString :  내부 공급자별 연결 문자열을 가져오거나 설정합니다. 

   Metadata : 연결 문자열의 메타데이터 위치를 가져오거나 설정합니다. 





'.NET 개발 > C#' 카테고리의 다른 글

명명된 파이프  (0) 2015.11.11
C# MailMessage 클래스로 네이버 메일 이용하기.  (0) 2015.11.10
인터페이스 사용 이유  (0) 2015.10.27
18.3 비동기 태스크 호출  (0) 2015.09.14
Task<T> Class  (0) 2015.08.10
Posted by Hoya0415
,


인터페이스 사용 이유 3가지

1. 일종의 규칙 만들기 

코딩을 하다가 실수 할 수 있기 떄문에 이를 미연에 방지하기 위한 방법으로 인터페이스를 사용.

인터페이스를 사용하면 규칙이 생기고 상속 받은 클래스는 내부에 정의된 형식이 반드시 구현되어야 한다. 

구현하지 않을 경우 디버깅 시, 예외를 발생시켜 마저 작성하라고 알려준다.


2. 다중 상속

C#은 기본적으로 다중상속을 지원하지 않기 때문에 꼭 필요한 상항에서는 인터페이스를 이용한 다중상속을 활용할 수 있다. 다중상속을 정의하는 방법을 잘 모르면 공부해야한다.


3. C#에 미리 정의된 인터페이스를 구현하기 위해서 사용할 때도 있다. 

IEnumerable, IEnumerator 같은 인터페이스들은 약속대로 작성만하면, 구현할 수 있다. 





'.NET 개발 > C#' 카테고리의 다른 글

C# MailMessage 클래스로 네이버 메일 이용하기.  (0) 2015.11.10
EntityFramework 활용하기.  (0) 2015.11.09
18.3 비동기 태스크 호출  (0) 2015.09.14
Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
Posted by Hoya0415
,

1. 어느 상황에서 연결면 끊긴 후 서버가 클라이언트를 인지 못하는지?


2. 한 객체에 연결이 두개가 안되기 때문에, 연결이 끊기면 못받는다.


실험 테스트

1. 라이센스가 꽉찬 상태에서 , 라이센스를 얻은 Client가 네트워크가 잠시 끈기면 재 연결 시도를 하는데 라이센스를 얻지 못할 수도 있다.

2. SignalR에 연결된 상태에서 네트워크가 끊겨도, 클라이언트는 Close 이벤트, Error 이벤트는 발생하지 않는다.

 - 클라이언트는 서버에게 보내는 단향방 비동기만 가능하고, 서버는 클라이언트에게 보낼 수 없다

 - 서버는 클라이언트가 죽었다고 인지한다.



'.NET 개발 > SignalR' 카테고리의 다른 글

2015-10-14 이슈 현황  (0) 2015.10.14
라이센스 이슈 해결 리스트  (0) 2015.10.08
Azure에 SignalR 배포  (0) 2015.07.20
Posted by Hoya0415
,

라이센스 갱신은 Client에서 Hub Connection이 정상적으로 되어있는 상태에서 


라이센스 갱신 시간에 응답한 경우에만 갱신이 가능하다.


1. 라이센스 갱신 시점에서 라이센스를 생성해 줘야한다.


문제 : 라이센스 갱신 시간에 응답을 못하였을 경우. (네트워크 문제 등..)

Error StatusCode: 404, ReasonPhrase: 'Not Found', Version: 0.0, Content: System.Net.Http.StreamContent, Headers:{  Content-Length: 0 }


2. 라이센스 History를 DB에 저장해야함. 사용자가 라이센스에 변화가 있을 경우

해결방법 : 

클라이언트가 -> 서버에 접속 시 

자신의 만료 기한을 가져오는데 

그 현재 시간이 그 기한보다 초과될 경우, 라이센스가 있는지 확인해서 없으면 생성하도록 한다. 



-----------이 변화에 대해서 알 방법이 지금으로써는 없다.------

1. 라이센스가 생성되는 변화. -> 라이센스 Create 문에서 변화를 알 수 있음.
2. 라이센스가 종료되는 변화. -> 라이센스 종료시간을 계속 체크해야함 
(종료되는 변화는 알 수 가 있을까?)
라이센스 개수가 변했을 경우에 저장?  or 초당 라이센스를 넣어야하는데 무의미 .


'.NET 개발 > SignalR' 카테고리의 다른 글

연결이 끊겼을 경우의 상황을 다 알아보기.  (0) 2015.10.21
라이센스 이슈 해결 리스트  (0) 2015.10.08
Azure에 SignalR 배포  (0) 2015.07.20
Posted by Hoya0415
,