[ASP.NET Core] WebAPI 구축하기.


ASP.NET Core WebAPI 를 구축하면서 어려움을 느꼈던 부분을 풀어 보겠습니다.


제가 이야기 하는 내용은 제가 공부하면서 알게된 내용을 정리한 것으로 개념을 잡는데 도움이 되리라 생각합니다.

다른 여러 Article 을 보시게 되면 더 많은 내용을 추가하실수 있을 겁니다.


그럼 Project 를 생성하면서 시작해 보겠습니다.




ASP.NET Core WebApplication Template 을 선택합니다.



나타나는 창에서 API 를 선택하고요. .NET 의 버전은 .NET Core 의 ASP.NET Core 2.1 을 사용하도록 하겠습니다.



OK 를 클릭하면 Project 를 생성합니다.



그럼 초기화면이 나타나지요.



생성된 폴더와 파일들 중에서 Properties 폴더를 열어서 launchSettings.json 을 클릭하여 열어봅니다.

이 파일에는 IIS Express 에 대한 내용이 들어 있습니다.

이 Project 의 경우에는 62148 port 를 사용하겠다고 적혀 있네요.


이번 Service 를 구축하면서 HTTPS 설정이 들어 갈텐데요. 

그 정보에 대한 내용을 이야기 할 때 다시한번 살펴보겠습니다.



이젠 Startup.cs 파일을 살펴보겠습니다.



Startup 클래스는 application 이 실행하면서 필요한 service 와 application 의 request pipeline 을 구성합니다.


이곳에는 Startup class 의 Constructor 와 두개의 중요한 Method 가 있습니다.


두 Method 의 역할은 주석에 간단하게 나타나 있습니다.

ConfigureServices Method 는 Application 에서 사용할 Service 를 Container 에 추가하는 곳입니다.

Configure Method 에서는 HTTP Request pipeline 을 구성합니다.


ASP.NET Core 에서는 기본적으로 Dependency Injection 을 지원합니다.



상단에 보시면 using Microsoft.Extentions.DependencyInjection; 을 보실 수 있는데 이 Namespace 내의 Extention Method 를 통해서 Service 를 등록할 수 있게 합니다.


ConfigurationServices Method 를 보시면 기본적으로 services.AddMvc() 가 추가되어 있는 걸 보실 수 있습니다

이 구문을 통해 Razor Page 와 MVC Request 를 처리할 수 있게 합니다.


Configure Method 에는  HTTP Request pipeline 을 구성한다고 했는데

수신된 Request 를 처리하는 순서대로 Middleware 를 추가합니다.




ConfigurationService Method 에 한가지 Setting 을 하려고 합니다.

ASP.NET Core 의 routing Middleware 는 controller name 을 rendering 할 때 Pascal Case 를 사용하는데요.

URL 에 lowercase 로 rendering 되도록 하려합니다.



주석을 영문, 한글로 다 달아 봤는데요. 

영어가 짧더라도 이해해 주시고요. 많이 어색하면 알려주셔요. 고치도록 하겠습니다. ^^;


그리고 마지막으로 중요한 사항인데요.

ConfigurationServices Method 의 경우 추가되는 Service 의 순서는 중요하지 않지만.

Configure Method 의 경우는 수신된 Request 가 처리되는 Pipeline 을 구성하는 것이므로 순서가 아주 중요하다는 것을 기억하시기 바랍니다.


간단간단하게 구성하며 정리를 하려했는데...

언제나 그렇지만 적어 내려가면서 계속 내용이 늘어나네요...


Series 가 좀 늘어날 수도 있으리라 생각이 들긴합니다. ^^;


다음 글에서는 Controller 를 추가해가면서 Test 를 진행해 보도록 하겠습니다.


Source


행복한 고수되셔요.


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\








Posted by woojja

저는 EntityFramework 사용하는 걸 별로 안좋아라 하는데요.


이 기능은 괜찮은 듯합니다. ^^;


FromSql 과 ExecuteSqlCommandAsync 입니다.


이 구문을 사용하면 Stored Procedure 를 사용할 수 있는데요.


이 구문을 사용하다가 Error 가 발생했습니다.



아래를 보시면 분명히 Stored Procedure 의 Parameter 가 선언이 되어 있는데요.

선언이 안되어 있다면서... 오류를 뱉내요...

철자가 틀린 것도 아닌데요. ㅡㅡ;



그래서 또 우리의 친구 Google 을 찾아 갔습니다.


그 결과 두둥!!!


EF Core 는 Parameter 이름을 지정하는 기능을 지원하지 않는다고 하네요. 그래서 Parameter 를 순서대로 @p0, @p1, ... 이런식으로 나열을 해야한다고 합니다. 헐렝...




그래서 고쳐서 Test 해 본 결과 

되네요... 



100% 맘에 드는 건 아니네요. ㅡㅡ;


그리고 INSERT, UPDATE, DELETE 를 할 때 ExecuteSqlCommandAsync 를 사용할 수 있는데요.

이 녀석은 적용받은 Row 의 수, int 값 만을 반환합니다. 알아두셔요. 



행복한 고수되셔요.



woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




Posted by woojja

Shared Project in VisualStudio


Microsoft 사의 Open 된 Source 를 보던 중 희안한 아이콘의 Project 를 보게 되었습니다.



헙!!! 이게 뭐징? 

하는 궁금증은 바쁜 일에 그냥 넘어갔습니다.


어디에 쓰는 프로젝트 이름으로 짐작하기만 했죠.



어느날 갑자기 그 프로젝트를 써봐야할 듯 해서 찾아 봤습니다.

먼저 Solution 파일을 Editor 로 열어봤습니다.




아니면 그냥 해당 폴더로 가서 프로젝트를 찾아 보시면  shproj 확장자를 가지고 있다는 걸 알수 있습니다.



그리고는 Project 가 있는지 찾아봤습니다.


Solution Explorer 에서 Solution 을 오른쪽 클릭하여 Add.../ New Project 을 클릭하면 Add New Project ... 창이 나타납니다.


하지만 아무리 찾아봐도 비스므레한 프로젝트는 없었습니다.


흠... 우리의 친구 구글... 구글링에 들어갑니다.


그 결과 Shared Project Reference Manager 라는 VisualStudio Extention 이 있다는 걸 발견했습니다.


https://marketplace.visualstudio.com/items?itemName=KieranMockfordMSFT.SharedProjectReferenceManager


화면에 Download 보이시죠?



클릭하여 다운받아 설치합니다.



오호~~ 프로젝트 템플릿이 생겼습니다...

추가해 봅시다.



오호호~~ 여러 프로젝트에서 사용할 수 있는 Class 를 생성하여 공통으로 사용할 수 있는 녀석으로 굳이 Entity 나 Utility 성의 Class 를 굳이 dll 로 떼어서 관리하지 않아도 되겠네요. ^^


음... 그런데 생각해 보면 여러 Project 가 이 Shared Project 를 참조하게 되면 생성되는 각각의 Assembly 들의 크기가 증가하겠네요... dll 을 참조하면 될텐데도 말이죠...


같은 기능을 하지만 여러 플랫폼을 대상으로 하는 dll 을 생성할 때와 같은 상황에서 이용하면 되겠군요.

jumptovb_Utilityx32.dll, jumptovb_Utilityx64.dll 와 같이 말이죠...





행복한 고수되셔요.



woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\








'Tools' 카테고리의 다른 글

[Tools] Shared Project in VisualStudio  (0) 2018.10.18
[Tools] GUID Maker Updated.  (0) 2017.10.31
[Tools] Log4Net  (0) 2017.10.12
[Tools] DotNetZip  (0) 2017.10.10
[Tools] 3 Ways to Change Bitrate on MP3 Files  (0) 2017.09.08
[Tools] NShape  (0) 2017.06.28
Posted by woojja


REST API 의 예제를 보면 여러 Parameter 를 사용하는 Method 를 볼 수있습니다.

간단히? 되리라 생각하지만 턱 하니 막히기도 하지요.


예제를 보면 아래와 같이 Method 에 사용하는 Multiple Parameter 지만 에 일반 Parameter 와 [FromBody] Attribute 를 달고 있는 Parameter 를 한꺼번에 사용하는 녀석을 만날 수 있습니다. 


// PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

 ASP.NET Core 로 개발 중 위와 같은 Method 를 Postman 에서 테스트하는 중 Value 에 값이 Null 로 들어오는 것을 발견했습니다. 




Postman 에서 Test 시 요로케 입력하면 되는군요... ㅋㅋㅋ



구글링하다 알게 되었네요...




행복한 고수되셔요...


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\






Posted by woojja


RestAPI 호출시 발생한 ajax Error 0




문제는 CORS 설정때문이었다.


Cors 에 대한 내용을 추가해주자...



Startup.cs


    public class Startup

    {

        public IConfiguration Configuration { get; set; }


        public Startup(IConfiguration configuration)

        {

            Configuration = configuration;

        }


        // This method gets called by the runtime. Use this method to add services to the container.

        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940

        public void ConfigureServices(IServiceCollection services)

        {

            // services.AddMvc(); 보다 앞에 위치 시킨다. (이건 Test 해보지 않았다. ^^;)

            services.AddCors();


            services.AddMvc();


            services.AddDataAccess();

            services.AddBusinessLogics();


            var configBuilder = new ConfigurationBuilder()

               .SetBasePath(Directory.GetCurrentDirectory())

               .AddJsonFile("appsettings.json", optional: true);

            var config = configBuilder.Build();


            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        }


        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)

        {

            if (env.IsDevelopment())

            {

                app.UseDeveloperExceptionPage();

            }


            // app.UseMvc(); 보다 앞에 위치 시킨다.

            app.UseOptions();


            //app.UseCors(builder => 

            //    builder.AllowAnyOrigin()

            //    .AllowCredentials()

            //    .AllowAnyHeader()

            //    .AllowAnyMethod()

            //    //.WithMethods("POST,GET,PUT,PATCH,DELETE,OPTIONS")

            //);


            //app.UseCors(builder =>


            //    //builder.AllowAnyOrigin().AllowAnyMethod()

            //    //.WithHeaders(HeaderNames.ContentType, "Authorization", "X-Requested-With")

            

//    builder.WithOrigins("*")

            //    //.AllowAnyOrigin()

            //    .AllowCredentials()

            //    .WithMethods("POST,GET,PUT,PATCH,DELETE,OPTIONS")

            //    .AllowAnyHeader()

            //    //.WithHeaders("Authorization", "X-Requested-With")

            //    );


            app.UseMvc();


            app.UseMvcWithDefaultRoute();


        }

    }



OptionsMiddleware.cs

    public static class OptionsMiddlewareExtensions

    {

        public static IApplicationBuilder UseOptions(this IApplicationBuilder builder)

        {

            return builder.UseMiddleware<OptionsMiddleware>();

        }

    }


    public class OptionsMiddleware

    {

        private readonly RequestDelegate _next;

        private IHostingEnvironment _environment;


        public OptionsMiddleware(RequestDelegate next, IHostingEnvironment environment)

        {

            _next = next;

            _environment = environment;

        }


        public async Task Invoke(HttpContext context)

        {

            this.BeginInvoke(context);

            await this._next.Invoke(context);

        }


        private async void BeginInvoke(HttpContext context)

        {

            //context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

            ////context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*", (string)context.Request.Headers["Origin"] });

            ////context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Content-Type: application/json, Accept, Accept: application/json, Authorization" });

            //context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });

            //context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });

            //context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });


            context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

            context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");

            // Added "Accept-Encoding" to this list

            //context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });

            context.Response.Headers.Add("Access-Control-Allow-Headers", "Authorization, Content-Type, X-Requested-With, Accept, Accept-Version, Accept-Encoding, Content-Encoding, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");

            context.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");


            if (context.Request.Method == "OPTIONS")

            {

                //context.Response.StatusCode = 200;

                //await context.Response.WriteAsync("OK");


                context.Response.StatusCode = (int)HttpStatusCode.OK;

                await context.Response.WriteAsync(string.Empty);

            }


        }

    }



Startup.cs 에서 


            .AllowAnyMethod() 대신 


            .WithMethods("POST,GET,PUT,PATCH,DELETE,OPTIONS") 로 변경해 보았는데.



Origin 과는 전혀 상관없는 오류가 발생했다. ㅡㅡ;

그렇다면 모든 Methos 를 열어줘야 한다는 이야기가 되는데... 그럼 안되겠죠? ㅋㅋ


그래서 app.UseCors(....) 를 사용하지 않고 위에 적어 놓은 Middleware 를 사용하기로 결정했다. 

Origins 의 경우는  Test 를 거쳐 변경할 예정이다.

Headers 의 경우도 현재는 Authorization, Content-Type, X-Requested-With 만 필요하지만 일단 다른 Header 들도 추가해 놓은 상태다.



ASP.NET Core 의 경우 ASP.NET 보다 유연하겠구나 라는 생각이 들긴하지만 서비스 내용을 바탕으로 설정해줘야 할 것들을 숙지하고 해둬야 하겠다.


이젠 WebSocket 을 붙여야 하는 상황인데...

Test 를 해보니 Socket 으로 가야할 녀석이 Controller 로 Routing 되는 걸 알게 되었다.


그럼 이만 Socket Test 하러... 슝~!




행복한 고수되셔요.


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




Posted by woojja

VisualStudio Code 에서 React 개발환경을 설정하는 순서를 나열해 봤습니다.


Typescript

Webpack

React

을 구성했고 추가적으로 

react-hot-loader

Babel

TSLint


를 설정하는 방법을 기술하였습니다.


추후 화면 Capture 를 추가할 예정입니다. (일단은 제가 확인하기 위한 내용으로...)



<source path>\React\>mkdir typescript-react-webpack

<source path>\React\>cd typescript-react-webpack


<source path>\React\typescript-react-webpack>code .

<source path>\React\typescript-react-webpack>mkdir src

<source path>\React\typescript-react-webpack>mkdir build


npm config list


npm set init.author.name "<Your Name>"

npm set init.author.email "yourAccount@woojja.com"

npm set init.author.url "www.woojja.com"

npm set init.license "MIT"



<source path>\React\typescript-react-webpack>npm init -y


Wrote to 

<source path>\React\typescript-react-webpack\package.json:


######################  package.json  ###########################

{

  "name": "typescript-react-webpack",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "keywords": [],

  "author": "JH.Woo <woojja@bachilab.com> (www.bachilab.com)",

  "license": "MIT"

}

###############################################################



Part 1 — Typescript and Webpack


<source path>\React\typescript-react-webpack>npm install --save-dev typescript webpack webpack-cli


<source path>\React\typescript-react-webpack>copy con webpack.config.js


ctlr + z


######################  webpack.config.js  ###########################


var path = require("path");


var config = {

    mode: 'development',

  /*

   * app.ts represents the entry point to your web application. Webpack will

   * recursively go through every "require" statement in app.ts and

   * efficiently build out the application's dependency tree.

   */

  entry: ["./src/app.ts"],


  /*

   * The combination of path and filename tells Webpack what name to give to

   * the final bundled JavaScript file and where to store this file.

   */

  output: {

    path: path.resolve(__dirname, "build"),

    filename: "bundle.js"

  },


  /*

   * resolve lets Webpack now in advance what file extensions you plan on

   * "require"ing into the web application, and allows you to drop them

   * in your code.

   */

  resolve: {

    extensions: ["*", ".ts", ".tsx", ".js"]

  },


  module: {

    /*

     * Each loader needs an associated Regex test that goes through each

     * of the files you've included (or in this case, all files but the

     * ones in the excluded directories) and finds all files that pass

     * the test. Then it will apply the loader to that file. I haven't

     * installed ts-loader yet, but will do that shortly.

     */

    rules: [

      {

        test: /\.tsx?$/,

        exclude: /node_modules/,

        use: ['ts-loader']

      }

    ]

  }

};


module.exports = config;


###################################################################




<source path>\React\typescript-react-webpack>npm  install --save-dev ts-loader



make file : index.html, src/app.ts, and src/some_module.ts


##########################  src/some_module.ts  ########################

const greeting: string = "Hello World!";


export default greeting;

###################################################################


##########################  src/app.ts  ################################

import greeting from "./some_module";


console.log(greeting);

###################################################################


##########################  index.html ################################

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Getting Started with Typescript, ReactJS, and Webpack</title>

  </head>

  <body>

    <script src="build/bundle.js"></script>

  </body>

</html>

###################################################################


<source path>\React\typescript-react-webpack2>copy con tsconfig.json

{

    "compilerOptions": {

      "jsx": "react",

      "module": "commonjs",

      "noImplicitAny": true,

      "outDir": "./build/",

      "preserveConstEnums": true,

      "removeComments": true,

      "target": "ES5"

    },

    "exclude": [

      "node_modules"

    ]

}

ctlr + z


<source path>\React\typescript-react-webpack>npm run build


index.html 실행



console 확인.




Part 2 — ReactJS


<source path>\React\typescript-react-webpack>npm install --save react react-dom


<source path>\React\typescript-react-webpack>npm install --save-dev @types/react @types/react-dom @types/react-router-dom // @types/webpack-env


############################## some_module.ts ==>  Hello.tsx #####################################

// Remember to rename your file to Hello.tsx and

// place it within your src/ directory

import * as React from "react";


interface HelloProps {

  name: string;

}


class Hello extends React.Component<HelloProps, {}> {

  render() {

    return <div>Hello, {this.props.name}</div>;

  }

}


export default Hello;

###################################################################



########################### app.ts ==>  app.tsx  ########################################

import * as React from "react";

import * as ReactDOM from "react-dom";

import Hello from "./Hello";


ReactDOM.render(

  <Hello name="Willson" />,

  document.getElementById("root")

);

###################################################################


##########################  index.html ###############################

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>Getting Started with Typescript, ReactJS, and Webpack</title>

  </head>

  <body>

    <!-- this is where our Hello component will get rendered into -->

    <div id="root"></div>


    <script src="build/bundle.js"></script>

  </body>

</html>

###################################################################



########################  webpack.config.js  ############################

var path = require("path");


var config = {

    mode: 'development',

  /*

   * app.ts represents the entry point to your web application. Webpack will

   * recursively go through every "require" statement in app.ts and

   * efficiently build out the application's dependency tree.

   */

  entry: ["./src/app.tsx"],


  /*

   * The combination of path and filename tells Webpack what name to give to

   * the final bundled JavaScript file and where to store this file.

   */

  output: {

    path: path.resolve(__dirname, "build"),

    filename: "bundle.js"

  },


  /*

   * resolve lets Webpack now in advance what file extensions you plan on

   * "require"ing into the web application, and allows you to drop them

   * in your code.

   */

  resolve: {

    extensions: ["*", ".ts", ".tsx", ".js"]

  },


  module: {

    /*

     * Each loader needs an associated Regex test that goes through each

     * of the files you've included (or in this case, all files but the

     * ones in the excluded directories) and finds all files that pass

     * the test. Then it will apply the loader to that file. I haven't

     * installed ts-loader yet, but will do that shortly.

     */

    rules: [

      {

        test: /\.tsx?$/,

        exclude: /node_modules/,

        use: ['ts-loader']

      }

    ]

  }

};


module.exports = config;

####################################################################


<source path>\React\typescript-react-webpack>npm run build



part 3 — Hot Module Replacement in React (react-hot-loader)


npm install --save-dev react-hot-loader


########################  webpack.config.js  #############################

const webpack = require('webpack');


module.exports = {

...,


plugins: [

new webpack.HotModuleReplacementPlugin()

], 

...


}


####################################################################


A huge development boost will give you react-hot-loader (Hot Module Replacement). 

It will shorten your feedback loop during development. 

Basically whenever you change something in your source code, 

the change will apply in your app running in the browser without reloading the entire page.


######################## app.tsx  ##################################

import * as React from "react";

import * as ReactDOM from "react-dom";

import Hello from "./Hello";


ReactDOM.render(

    <Hello name="Willson" />,

    document.getElementById("root")

  );


module.hot.accept();

####################################################################


참고 :

https://medium.com/@francesco.agnoletto/how-to-set-up-typescript-with-babel-and-webpack-6fba1b6e72d5


https://github.com/Kornil/simple-ts-react-app




import * as React from "react";

import * as ReactDOM from "react-dom";

// hot reload for development

import { AppContainer } from "react-hot-loader";


import App from "./App";


import "./style.scss";


const root = document.getElementById("root") as HTMLElement;


const render = (Component: React.SFC) => {

  ReactDOM.render(

    <AppContainer>

      <Component />

    </AppContainer>,

    root,

  );

};


render(App);


if (module.hot) {

  module.hot.accept("./App", () => {

    render(App);

  });

}


module.hot.accept();

####################################################################


Part 4 — Babel



<source path>\React\typescript-react-webpack>npm install --save-dev babel-core babel-loader

<source path>\React\typescript-react-webpack>npm install --save-dev @babel/core source-map-loader

<source path>\React\typescript-react-webpack>npm install --save-dev @babel/preset-typescript @babel/preset-react @babel/preset-env



<source path>\React\typescript-react-webpack>copy con .babelrc

{

  "presets": ["@babel/react", "@babel/typescript", ["@babel/env", { "modules": false }]]

}

ctrl + z



Tokenization is skipped for lines longer than 20k characters for performance reasons.



part 5 — Setting up TSLint


npm install --save-dev tslint tslint-react



########################  tslint.json  ##################################

{

  "extends": ["tslint:recommended", "tslint-react"],

  "rules": {}

}

####################################################################


행복한 고수되십시오. 


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\




Posted by woojja


안녕하세요? 


WebAPI 을 작성하면서 Autofac 을 사용해 보려는데...

이거 뭐... 현명한 선택인지... ^^;


Owin 이 포함되어야하므로...


Install-Package Autofac

Install-Package Autofac.Owin

Install-Package Autofac.WebApi2

Install-Package Autofac.WebApi2.Owin


행복한 고수되셔요.


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




Posted by woojja


PowerShell 을 사용하여 MachineKey 를 작성하는 방법입니다.


Appendix A: How to generate a <machineKey> element

아래 Function 을 PowerShell 에 Copy & Paste 하여 Enter 를 쾅! 칩니다. ^^


# Generates a <machineKey> element that can be copied + pasted into a Web.config file.
function Generate-MachineKey {
  [CmdletBinding()]
  param (
    [ValidateSet("AES", "DES", "3DES")]
    [string]$decryptionAlgorithm = 'AES',
    [ValidateSet("MD5", "SHA1", "HMACSHA256", "HMACSHA384", "HMACSHA512")]
    [string]$validationAlgorithm = 'HMACSHA256'
  )
  process {
    function BinaryToHex {
        [CmdLetBinding()]
        param($bytes)
        process {
            $builder = new-object System.Text.StringBuilder
            foreach ($b in $bytes) {
              $builder = $builder.AppendFormat([System.Globalization.CultureInfo]::InvariantCulture, "{0:X2}", $b)
            }
            $builder
        }
    }
    switch ($decryptionAlgorithm) {
      "AES" { $decryptionObject = new-object System.Security.Cryptography.AesCryptoServiceProvider }
      "DES" { $decryptionObject = new-object System.Security.Cryptography.DESCryptoServiceProvider }
      "3DES" { $decryptionObject = new-object System.Security.Cryptography.TripleDESCryptoServiceProvider }
    }
    $decryptionObject.GenerateKey()
    $decryptionKey = BinaryToHex($decryptionObject.Key)
    $decryptionObject.Dispose()
    switch ($validationAlgorithm) {
      "MD5" { $validationObject = new-object System.Security.Cryptography.HMACMD5 }
      "SHA1" { $validationObject = new-object System.Security.Cryptography.HMACSHA1 }
      "HMACSHA256" { $validationObject = new-object System.Security.Cryptography.HMACSHA256 }
      "HMACSHA385" { $validationObject = new-object System.Security.Cryptography.HMACSHA384 }
      "HMACSHA512" { $validationObject = new-object System.Security.Cryptography.HMACSHA512 }
    }
    $validationKey = BinaryToHex($validationObject.Key)
    $validationObject.Dispose()
    [string]::Format([System.Globalization.CultureInfo]::InvariantCulture,
      "<machineKey decryption=`"{0}`" decryptionKey=`"{1}`" validation=`"{2}`" validationKey=`"{3}`" />",
      $decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
      $validationAlgorithm.ToUpperInvariant(), $validationKey)
  }
}


그러면 추가한 Generate-MachineKey 를 사용해 봐야겠죠?!


ASP.NET 4.0 application 에서는 Machine Key 작성시 Option Parameter 를 주지 않아도 됩니다.


PS> Generate-MachineKey

<machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />


하지만 ASP.NET 2.0 과 3.5 application 에서는 HMACSHA256 을 지원하지 않으므로 Parameter 로 "SHA1" 을 넣어줘야 한다네요.


PS> Generate-MachineKey -validation sha1

<machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />


ASP.NET 그리고 Web.config 파일에 MachineKey element 를 추가해 줍니다.


<configuration>

  <system.web>

    <machineKey ... />

  </system.web>

</configuration>


행복한 고수되셔요.



woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




'Security' 카테고리의 다른 글

[SECURITY] MachineKey 만들기  (0) 2018.08.03
Posted by woojja



Time Zone Identifiers 정보입니다.

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/bb384272%28v%3dvs.90%29


UTC Time 을 Localtime 으로 변경하시려면...


TimeZoneInfo koreaStandardTimeZone 

= TimeZoneInfo.FindSystemTimeZoneById("Korea Standard Time");

DateTime koreaStandardTime 

= TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, koreaStandardTimeZone);

MessageBox.Show(koreaStandardTime.ToString("yyyy-MM-dd HH:mm:ss"));



이렇게 사용하시면 되겠습니다.



행복한 고수되셔요. ^^

woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




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

[.NET] Time Zone Identifiers  (2) 2018.07.24
[.NET] Clone  (0) 2017.05.31
[.NET] Collection was modified; enumeration operation may not execute.  (4) 2017.05.30
[.NET] .NET Core Roadmap  (0) 2017.02.10
[.NET] Bit 연산에 대한 내용입니다.  (0) 2014.05.07
[.NET] Telerik Code Convertor  (0) 2014.05.07
Posted by woojja

Node.JS 테스트 중 CentOS 에 rpmforge 를 설치해야만 하게 됐는데요.


찾았던 자료들이 너무 오래되어서 Download Site 가 사라져버려 접속이 안되고 있었습니다.


그래서 업데이트 한 링크를 바탕으로 설치하는 방법입니다.


내용은 

https://centos.pkgs.org/6/repoforge-x86_64/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm.html

에 있습니다.



  1. Download the latest rpmforge-release rpm from
    http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/
  2. Install rpmforge-release rpm:
    # rpm -Uvh rpmforge-release*rpm
  3. Install rpmforge-release rpm package:
    # yum install rpmforge-release


1. wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/  로 Download 받습니다.

2. sudo rpm -Uvh rpmforge-release*rpm 을 실행하여 설치합니다.

3. sudo yum install rpmforge-release 로 Package 를 설치합니다.


다음 산을 넘으러 가보겠습니다.


행복한 고수되십시요. 


woojja ))*

₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩₩




Posted by woojja