Swagger UI를 Nuget에서 받아보시면, App_Start 에 SwaggerConfig.cs가 생깁니다.

그 cs 파일에 Register 함수 안에 기본(Basic) 인증,  Api key , oAuth2 세 가지 인증(Authoirze) 구성이 있습니다.

저는 Swagger 페이지만 안들어가게 하고 싶을 뿐이였고, 사이트는 기본 인증을 베이스로 관리 페이지를 만들었습니다. Swagger Ui는 아래와 같은 URL로 만들어집니다.

http://{host}/swagger/ui/index

만약에 이 페이지를 못 들어가게 하고 싶다면 web.config에 아래와 같이 구성해주시면 됩니다.

<allow roles="{허용할 Role}"> // 기본인증 된 Role 중에 허용할 Role을 넣으시면 됩니다.

<deny users="*"> //모든 유저를 금지한다는 의미

<configuration>
  <location path="swagger">
    <system.web>
      <authorization>
        <allow roles="api"/> 

        <deny users="*"/> 
      </authorization>
    </system.web>
  </location>
</configuration>



Posted by Hoya0415
,

모꼬지라는 웹 사이트를 서비스 하고 있어요~


클래스 및 모임 을 중계해 주는 사이트인데


이미지 관련된 부분이 많아서 Thumbnail을 만들어보려고 하는 도중에


비트윈이라는 프로그램에서 Skia를 쓰고 나서 속도가 빨라졌다는 얘기를 듣고 도전해보기로 했어요


제가 닷넷 유저라  닷넷으로된 소스가 없나 찾아보았더니 


GitHub에 모노(Mono) 프로젝트로 SkiaSharp 이 있더라구요 너무 다행이었어요.


C++로 된 LIB를 가져와서 DLL로 변환 후에 Dllmport 하지 않아도 되는 귀찮음이 없어져서요^^


물론 Visual Studio 켜서~ Nuget Pagkage 쪽에서 SkiaSharp으로 받아도 된답니다.~


SkiaLibrary 설명으로는 제가 본것은 Xamarin 쪽에 올라온 것과 구글쪽에 라이브러리 설명이 있어요


라이브러리 설명 :  구글 , Xamarin


모르는 라이브러리 있으면 찾아보면 됩니다.


지금 버전은 Version 1.54.0에요


GitHub으로 다운을 받았다면 아래와 같은 폴더 구성으로 되어있어요



자자 다른건 볼 필요없이 samples 폴더-> Skia.WPF.Demo 폴더로 들어가서 Solution 프로젝트(Skia.WPF.Demo.sln)를 열어봅시다.


켜보면 분명 에러 나올겁니다. 



안나오시는 분들있으면 그대로 진행해주세요^^.

오류 내용은 1.54.0.1 버전으로 받아야져있는데 Nuget에는 1.54.0 버전만 있어서 찾을 수 없다. 이런 내용입니다. Nuget 패키지 복원하셔도 1.54.0.1이 없어서 못 받으실거에요.

해결 방법은 기존의 1.54.0.1 을 지우고 1.54.0 버전을 받으면 됩니다.


먼저 packages.config 파일로 가서 version="1.54.0.1" 로 되어있는 것을 version="1.54.0" 인 현재 버전으로 바꾸어주세요. 그러면 오류가 하나 없으질 것이고,


다시 폴더로와서 Skia.WPF.Demo.csproj 이 파일을 편집으로 열어봅시다.



<Import Project="packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets" Condition="Exists('packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets')" />


<Error Condition="!Exists('packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.1.54.0.1\build\net45\SkiaSharp.targets'))" />


위에 두 부분을 현재 버전으로 바꿔주자


<Import Project="packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets" Condition="Exists('packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets')" />


<Error Condition="!Exists('packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.1.54.0\build\net45\SkiaSharp.targets'))" />


이렇게 하면 에러는 사라진다~


이후로는 SK...CLASS이름 들의 에러가 나오는데 Nuget Package에서 SkiaSharp을 제거 후에 다시 설치하자.



이 라이브러리가 설치가 되면  빌드(Build)를 한다. 그리고 이제는 


프로젝트에 간단한 에러사항들을 처리해준다.


나의 경우는 아래의 함수가 없는데 호출할려고해서 주석으로 처리했다.

//path.GetTightBounds (out rect);


그리고 이제 빌드를 하면 

오류 The Platform needs to be either x64 or x86 to support Skia in Windows. Skia.WPF.Demo

위의 오류 메세지가 나오는데 



Platform 을 바꿔서 실행하자!x64나 x86 둘중 하나 고르면 되요



자 실행 되었다.

간단히 콤보박스를 넘겨보면서 샘플을 보자

여기까지 오셨으면 다음 시간 2탄에는 SkiaSharp을 이용해서 이미지를 Resize하는 방법을 알려주겠어요~

수고하셨습니다. 


댓글은 작성자에 대한 고마움의 표시입니다.^^

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

Webp C#  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

Webp C#

.NET 개발/C# 2016. 9. 23. 09:33

구글 라이브러리 Webp 를 닷넷에서 쓰려면 


C++ 라이브러리를 C#으로 사용 할 수 있게 dllImport 시켜줘야 해요


아직 이 부분은 안해보았습니다.


검색을 더 해보니 webp-discuss 그룹


이 그룹 페이지에 중요한 링크를 얻었어요


하나는 WEBP-NET GitHub 페이지 입니다. 여기서 32bit , 64bit DLL을 얻을 수 있습니다.


이렇게 DLL이 나눠져있다는건 플랫폼에 따라 불러와야하는 DLL이 다르다는거 아실거라 믿습니다~


물론 샘플 파일도 있습니다.


그리고..다른 WEBP 그룹 에 보면 


테스트 샘플 자료도 있습니다.


webptest_compild.zip


WebPTest_sources_and_dll.zip


샘플 파일도 있어서 확인해보면 됩니다.!



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

C# Skia Sharp 사용해보기 (예제편) 1탄  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,


1. 내 문서 경로\IISExpress\config\applicationhost.config 을 편집으로 파일을 연다.


2. 단어 검색으로 <sites>부분을 검색하고


  <site name="프로젝트이름" id="3">

                <application path="/" applicationPool="Clr4IntegratedAppPool">

                    <virtualDirectory path="/" physicalPath="H:\프로젝트이름" />

                </application>

                <bindings>

                    <!--<binding protocol="http" bindingInformation="*:58665:localhost" />-->

                     <binding protocol="http" bindingInformation="*:58665:" /> 

                </bindings>

  </site>


Visual Studio  생성한 웹 사이트 주소를가 Site 태그에 있을 것이다.


물리적주소 physicalPath도 보인다


그리고 <binding 태그를 보면 원래는 bindingInformation 이 부분이 아래와 같은데 


 <!--<binding protocol="http" bindingInformation="*:58665:localhost" />-->


바꿔주면 된다.


<binding protocol="http" bindingInformation="*:58665:" /> 


바꾼 후 관리자 모드로 Visual Studio를 켜고 프로젝트를 불러와서 실행해보면 


외부 IP로도 접근이 가능하다.


※추가※

만약 위에 사항해도 안된다면 

방화벽은 해제와 고급 보안이 포함된 윈도우 방화벽에서 인바운드 포트를 열어주면 된다.


Posted by Hoya0415
,



C# 1.0 

VM언어이지만 Interop을 고려 

PInvoke, unsafe(pointer), delegate


c# 2.0 제네릭

c# 2.0 ?? 연산자

c# 2.0 yield return/break

c# 2.0 partial class 

- 클래스의 구현을 2개 이상으로 분리

- 자동 코드 생성의 문제점 해결!


c# 2.0 anonyumous method

- 이름 없는 메서드 정의 가능

- delegate 타입의 인자로 인라인 메서드 정의 

- 이벤트 처리기


c# 2.0  static class

- IL 코드 표현 : 상속 불가능한 추상 클래스

- C# 컴파일러 : 인스턴스 멤버 정의 불가능


1. C++의 Template과 유사

2.메서드 수준의 제네릭 지원

3. 박싱/언박싱 문제 해결

참조 형식이면 상관이 없지만, 값형식일 경우는 제너릭을 사용하는게 좋다.

4. 1) 제약1 - 상속타입 

   2) 제약2 - 값/참조 타입

   3) 제약3 - 인자 없는 생성자 필수 



c# 2.0 - Nullable 타입

.net 2.0 BCL: Nullable<T> 구조체 추가

c#의 경우 T? 형태로 단축 표기



C# 3.0 자동 구현 속성

- Field + Property 구현을 단순화

- Get/Set의 접근 제한자


C# 3.0 컬렉션 초기화

- ICollection 인터페이스를 구현한 타입

- 컬렉션의 요소를 new 구문에서 추가


C# 3.0 - LINQ

- LINQ : Language-Inegrated Query

-> 언어에 통합된 쿼리 표현식(Query Expressions)

-SQL 쿼리의 SELECT와 유사 


C# 3.0 - var 예약어

- 컴파일러가 로컬 변수의 형식을 추론

- C++ 11의 auto 예약어와 동격


C# 3.0 - 객체초기화(1)

- 공용 속성을 통해 객체 생성시에 초기화

- LINQ에 사용 anonyumous type

- 컬렉션 초기화 + 객체 초기화


C# 3.0 - 익명 타입

이름 없는 타입

- 내부적인 처리는 익명 메서드와 유사

- var 사용은 필수

- Linq Select,Join


C# 3.0 - 확장메서드

- 정적 메서드를 마치 인스턴스 메서드처럼 사용

- 결국 정적 메서드 호출

- 쿼리 구문과 메서드 기반 구문 (53분)

- WEHER

- ORDER BY


C# 3.0 람다 식

- 추론을 통해 delegate 익명 메서드 개선

- 값 반환 + 단문 메서드 -> return + 중괄호 생략

- 메서드 기반 쿼리를 단순화.

- 데이터로써의 람다 => Expression Tree

- Exptression Tree 컴파일

- SQL 쿼리를 생성

  LINQ TO SQL 실행 시 실제 쿼리로 생성이 된다.

- 사례2) 공용 속성 이름

  LINQ to...

  표준 쿼리 연산자


C# 4.0 - 선택적 매개 변수

선택적 매개변수

-C++의 디폴트 매개변수


C# 4.0 - 명명된 인자.

-인자의 이름으로 호출 측에 값 전달


C# 4.0 - dynamic 

-실행 시에 결정되는 타입

-결국엔 object 타입

-IronPython과 C#

-C#에서 IronPython 메서드 연동

'


C# 5.0 - 호출자 정보 (다시 봐야함)

C++의 3가지 메크로 상수에 대응


C# 5.0 - async-await

-마치 동기 방식처럼 비동기 호출

-사용자 정의 ...Async 메서드












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

C# Skia Sharp 사용해보기 (예제편) 1탄  (0) 2016.09.23
Webp C#  (0) 2016.09.23
대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Posted by Hoya0415
,

대리자는 메소드의 참조 혹은 콜백으로서 명령어들을 코드로 만든 다음 바로 호출하는 방식보다 다른 위치의 명령어의 집합을 호출할 수 있도록 전달하는 강력한 개념이다.


C# 3.0 에서는 Lambda 식을 소개하고 있고 

C# 2.0 에서는 익명 메소드 문법을 대체한다. (익명 메소드는 사라진게 아니다)


이런 닷넷의 특징들은 메소드 내에서 동적으로 명령들을 수행하는데 있어, 굉장한 유연성을 제공한다.

이것이 바로 LINQ라는 통합 언어 징의 (Language Integrated Query API를 이용해서 컬렉션에 대해 프로그래밍을 한결 쉽게 해주는 기능이다.


람다 식은 문 람다와 식 람다 두가지를 포괄한다. 

식 트리의 대한 개념과 대리자 구현 그대로가 아닌 람다 식의 의미론적인 분석을 표현하는 부분은

Linq to SQL 과 Linq to XML과 같은 컨텍스트 내에서 식트리를 해석하는 라이브러리의 핵심적인 특징이다.


example. 1


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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class Program
    {
        public enum SortType
        {
            Ascending,
            Desending
        }
 
        static void Main(string[] args)
        {
 
            ComparisonHandler c = (int first, int second) => { return first > second; };
            Func<int,int,bool> f = c.Invoke;
 
 
            int[] items = new int[] { 1121354};
 
            //문 람다
            //var result = BubbleSort(items, (int first, int second) => { return first > second;});
 
            //식 람다
            var result = BubbleSort(items, (int first, int second) => first > second);
 
            //익명 메소드
            //var result = BubbleSort(items, delegate(int first, int seconde){return first > seconde;});
 
            //매개변수가 없는 익명 메소드
            //var result = BubbleSort(items, delegate { return Console.ReadLine() != ""; });
            
 
            foreach (var item in result)
            {
                Console.WriteLine(item.ToString());
            }
 
            Console.ReadLine();
        }
 
        public static bool GreaterThan(int first, int second)
        {
            return first > second;
        }
 
        public static bool AlphabeticalGreaterThan(int first, int second)
        {
            int comparison;
 
            comparison = (first.ToString().CompareTo(second.ToString()));
 
            return comparison > 0;
        }
 
        public delegate bool ComparisonHandler(int first, int seconde);
 
        static int[] BubbleSort(int[] items, Func<int,int,bool> comparisonHandler)
        {
            int i;
            int j;
            int temp;
 
            if (items != null)
            {
                for (i = items.Length - 1; i >= 0; i--)
                {
                    for (j = 1; j <= i; j++)
                    {
                        if (comparisonHandler(items[j-1], items[j]))
                        {
                            temp = items[j - 1];
                            items[j - 1= items[j];
                            items[j] = temp;
                        }
                    }
                }
            }
 
            return items;
        }
 
        static int[] BubbleSort(int[] items, SortType sortOder)
        {
            int i;
            int j;
            int temp;
 
            if(items != null)
            {
                for ( i = items.Length - 1; i >= 0; i--)
                {
                    for ( j = 1; j <= i; j++)
                    {
                        bool swap = false;
 
                        switch(sortOder)
                        {
                            case SortType.Ascending:
                                swap = items[j - 1> items[j];
                                break;
                            case SortType.Desending:
                                swap = items[j - 1< items[j];
                                break;
                        }
 
                        if(swap)
                        {
                            temp = items[j - 1];
                            items[j - 1= items[j];
                            items[j] = temp;
                        }
                    }
                }
            }
 
            return items;
        }
    }
cs


example 2.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 List<string> stList = new List<string>() { "a""b""c""f""d""g" };
 
            var selection = stList.Where((st, index) =>
            {
                var item = index.ToString();
 
                if (st == "a" && index == 0)
                    return true;
                else
                    return false;
            });
 
            foreach (var item in selection)
            {
                Console.WriteLine(item);
            }
 
cs


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

Webp C#  (0) 2016.09.23
C#의 발전 내용  (0) 2016.06.06
lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
Posted by Hoya0415
,

lambda expression

.NET 개발/C# 2016. 6. 5. 15:36

식 트리가 데이터의 컬렉션이며 반복처리를 거쳐 다른 형태의 자료로 변환 할 수 있다는 점이 중요하다.

식 트리를 자기 기술적 문자열로 변환해서 다른 질의 언어로 변환하는 것도 얼마든지 가능하다.




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
class Program
    {
        static void Main(string[] args)
        {
            Expression<Func<intintbool>> expression;
 
            expression = (x, y) => x > y;
 
            Console.WriteLine("--------------{0}---------------",expression);
 
            PrintNode(expression.Body, 0);
 
            Console.WriteLine();
            Console.WriteLine();
 
            expression = (x, y) => x * y > x + y;
 
            Console.WriteLine("--------------{0}---------------", expression);
 
            PrintNode(expression.Body, 0);
 
            Console.WriteLine();
            Console.WriteLine();
        }
 
        private static void PrintNode(Expression expression, int indent)
        {
            if (expression is BinaryExpression)
                PrintNode(expression as BinaryExpression, indent);
            else
                PrintSingle(expression, indent);
        }
 
        private static void PrintNode(BinaryExpression expression, int indent)
        {
            PrintNode(expression.Left, indent + 1);
            PrintSingle(expression, indent);
            PrintNode(expression.Right, indent + 1);
 
 
        }
 
        private static void PrintSingle(Expression expression, int indent)
        {
            Console.WriteLine("{0," + indent * 5 + "}{1}""", NodeToString(expression));
        }
 
        private static string NodeToString(Expression expression)
        {
            switch (expression.NodeType)
            {
                case ExpressionType.Multiply:
                    return  "*";
                case ExpressionType.Add:
                    return "+";
                case ExpressionType.Divide:
                    return "/";
                case ExpressionType.Subtract:
                    return "-";
                case ExpressionType.GreaterThan:
                    return ">";
                case ExpressionType.LessThan:
                    return "<";
                default : return expression.ToString() + " (" + expression.NodeType.ToString() + ")";
            }
        }
    }
cs


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

C#의 발전 내용  (0) 2016.06.06
대리자와 람다 식  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
WebSecurity 클래스  (0) 2015.12.03
Posted by Hoya0415
,
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
  class Program
    {
        static void Main(string[] args)
        {
            //반공변성 
            Action<object> broadAction = (object data) =>
            {
                Console.WriteLine(data);
            };
 
            Action<string> narrowAction = broadAction;
 
            // 공변성
            Func<string> narrowFunction = () => Console.ReadLine();
 
            Func<object> broadFunction = narrowFunction;
 
            
            //반공변성과 공변성 조합
 
            Func<objectstring> func1 = (object data) => data.ToString();
            Func<stringobject> func2 = func1;
 
            var items = new string[] { "Moe""Larry""Curly" };
            var actions = new List<Action>();
             
            for (int i = 0; i < items.Count(); i++)
            {
                int j = i;
                Console.WriteLine(items[j]);
                actions.Add(() => { Console.WriteLine(items[j]); });
            }
            //foreach (string item in items)
            //{
            //    actions.Add(() => { Console.WriteLine(item); });
            //}
 
            foreach (Action action in actions)
            {
                action();
            }
 
        }
    }
cs


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

대리자와 람다 식  (0) 2016.06.05
lambda expression  (0) 2016.06.05
Xaml web browser application .xbap 캐시 지우기  (0) 2015.12.21
WebSecurity 클래스  (0) 2015.12.03
NamedPipeClientStream 에러 : System.UnauthorizedAccessException  (0) 2015.11.17
Posted by Hoya0415
,

Xaml web browser application 을 업데이트 할 경우 캐시를 지워줘야함


Visual Studio 명령 프롬프트를 실행해서 아래 메세지를 치면 된다. 

mage -cc


명령 프롬프트 창이 없으면, cmd에서 아래의 명령어를 치면 된다.

rundll32 %windir%\system32\dfshim.dll CleanOnlineAppCache


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

lambda expression  (0) 2016.06.05
공변성, 반공변성  (0) 2016.06.05
WebSecurity 클래스  (0) 2015.12.03
NamedPipeClientStream 에러 : System.UnauthorizedAccessException  (0) 2015.11.17
명명된 파이프  (0) 2015.11.11
Posted by Hoya0415
,

IIS에서 PUT DELETE가 안될 때 Method Not Allowed 405

WEB API 에서 DELETE Method 만들고, 로컬에서 테스트 할 때는 정상적으로 작동하지만,

IIS 서버에 호스팅하게 되면, 안될 수 가 있다. HTTP Method에 제한이 걸려있을 텐데

Handler Mapping에서 WebDav 쪽에 Method가 제한되



IIS Handler Mapping -> WebDAV를 찾는다..



요청 제한 버튼을 클릭한다.


동사 탭을 선택 후 모든 동사들 체크해서 확인 누른다.





<handlers>
  <remove name="WebDAV" />
  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
</handlers>

그리고 위에 구문을 Web.config에 써주면 된다. 
IIS를 재실행하자


Posted by Hoya0415
,