Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Tags
more
Archives
Today
Total
관리 메뉴

형관봇

WCF 비동기 통신 서비스 만들기 본문

WCF

WCF 비동기 통신 서비스 만들기

최강도어 2017. 2. 17. 18:28

클라이언트 프로그램 내에서 DB를 접속하게 하여 데이터를 보여줄 수 있지만


2-Tier 방식의 프로그램 이기때문에 WCF를 통한 미들웨어로 3-Tier를 만들어 보겠습니다.



Binding


바인딩은 WCF서비스가 어떻게 클라이언트들과 통신할 수 있는지를 정의하는 일련의 속성입니다.


바인딩은 Endpoint와 통신하기 위해 사용되는 HTTP 또는 TCP와 같은 전송매체를 정의합니다.


바인딩

설명 

 BasicHttpBinding

 WS-Basic Profile 사양의 웹 서비스와 통신하는 데 적합한 바인딩에는 ASP.NET 웹 서비스(ASMX) 기반 서비스 등이 있습니다. 이 바인딩은 HTTP를 전송으로 사용하고 텍스트/XML을 기본 메시지 인코딩으로 사용합니다.

 WSHttpBinding

 이중 서비스 계약에 적합한 안전하고 상호 운용할 수 있는 바인딩입니다.

 WS2007HttpBinding

 올바른 버전의 Security, ReliableSession 및 TransactionFlow 바인딩 요소를 지원하는 안전하며 상호 운용 가능한 바인딩입니다.

 WSDualHttpBinding

 이중 서비스 계약 또는 SOAP 매개자를 통한 통신에 적합한 안전하고 상호 운용할 수 있는 바인딩입니다.

 WSFederationHttpBinding

 WS-Federation 프로토콜을 지원하는 안전하며 상호 운용 가능한 바인딩을 사용하면 페더레이션에 있는 조직이 사용자를 효율적으로 인증하고 권한을 부여할 수 있습니다.

 WS2007FederationHttpBinding

 WS2007HttpBinding에서 파생되었으며 페더레이션 보안을 지원하는 안전하고 상호 운용 가능한 바인딩입니다.

 NetTcpBinding

 WCF 응용 프로그램 간 시스템 통신에 적합한 안전하고 최적화된 바인딩입니다.

 NetNamedPipeBinding

 WCF 응용 프로그램 간 시스템 통신에 적합한, 안전하고 신뢰할 수 있으며 최적화된 바인딩입니다.

 NetMsmqBinding

 WCF 응용 프로그램 간 시스템 통신에 적합한 대기 중인 바인딩입니다.

 NetPeerTcpBinding

 안전하게 여러 시스템 간에 통신할 수 있는 바인딩입니다.

 WebHttpBinding

 SOAP 메시지 대신 HTTP 요청을 통해 노출되는 WCF 웹 서비스에 대한 끝점을 구성하는 데 사용되는 바인딩입니다.

 MsmqIntegrationBinding

 WCF 응용 프로그램과 기존 메시지 큐(MSMQ라고도 함) 응용 프로그램 간 시스템 통신에 적합한 바인딩입니다.



BasicHttpBinding 으로 WCF를 구성하여, 서버와 클라이언트 통신을 간략히 만들어 보겠습니다.



[ 서버 ]


콘솔 응용 프로그램으로 프로젝트를 생성합니다.




클래스 파일을 2개 추가하겠습니다. ( Service.cs, IService.cs )




다음은 WCF와 DB Connection 구성을 위한 참조 추가를 하겠습니다.


WCF 구성을 위한 참조 : System.ServiceModel

DB Connection정보 구성을 위한 참조 : System.configuration




Service.cs를 먼저 작성 하겠습니다.


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Threading;
using System.Data.SqlClient;
using System.Data;
 
namespace WCF_TEST
{
    class Service : IService
    {
        /* SqlConnection */
        public static SqlConnection sqlconnection = 
            new SqlConnection(ConfigurationManager.ConnectionStrings["QQ_DATABASE"].ConnectionString);
 
        /*=====================================================
        *  GetTxt : string 반환 함수
        =====================================================*/
        public string GetTxt()
        {
            return "string 반환 TEST 입니다.";
        }
 
        /*=====================================================
        *  GetDT : 프로시저 호출 / DataTable 반환
        =====================================================*/
        public DataTable GetDT()
        {
            GC.Collect();
 
            DataTable datatable = new DataTable("GetDT");
 
            SqlDataAdapter sqlAdapter = new SqlDataAdapter("dbo.SP_TEST_PROC", sqlconnection);
            sqlAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
 
            sqlconnection.Open();
            sqlAdapter.Fill(datatable);
            sqlconnection.Close();
 
            sqlAdapter.Dispose();
 
            return datatable;
        }
    }
}
cs


string 반환 함수 1개, DataTable 반환 함수 1개를 작성하였습니다.


데이터베이스 Connection String을 App.config 파일에 설정해야 하겠죠?


1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
 
    <connectionStrings>
      <add name="QQ_DATABASE" 
        connectionString="Data Source=db.test.com;Initial Catalog=QQdb;User ID=qqID;Password=qqPass"
        providerName="System.Data.SqlClient"/>
    </connectionStrings>
  
</configuration>
cs



MS SQL 프로시저도 필요하겠죠?



총 6개의 행이 SELECT 되었습니다.



IService.cs를 작성해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
 
namespace WCF_TEST
{
    [ServiceContract]
    interface IService
    {
        /* string 반환 */
        [OperationContract]
        string GetTxt();
 
        /* DataTable 반환 */
        [OperationContract]
        DataTable GetDT();
    }
}
cs


Service.cs 에서 정의한 함수를 호출하는 Interface 입니다.



Program.cs를 수정해보겠습니다.


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;
 
namespace WCF_TEST
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri baseUri = new Uri("http://192.168.15.41:1150/wcf");
            using (ServiceHost serviceHost = new ServiceHost(typeof(Service), baseUri))
            {
                serviceHost.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "");
 
                ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();
                mexBehavior.HttpGetEnabled = true;
                serviceHost.Description.Behaviors.Add(mexBehavior);
 
                serviceHost.AddServiceEndpoint(typeof(IMetadataExchange),
                    MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
                serviceHost.Open();
 
                Console.WriteLine("SERVER 정상기동");
                Console.ReadLine();
            }
        }
    }
}
 
cs


이와같이 간단한 서버 프로그램이 작성 되었습니다.


포트는 필요하신 포트로 수정하시면 됩니다.


빌드 후 실행하면 다음과 같이 기동됩니다.




자, 이제 클라이언트 프로그램을 작성해볼까요?



[ 클라이언트 ]


클라이언트 프로그램은 윈폼으로 작성해 보겠습니다.



간단히, 버튼을 올려줍니다.



서비스 참조 추가를 하여 서버와 연동을 시킵니다.




서버 프로그램에서 작성하였던 주소를 넣고 이동을 누르시면, 작성해 두었던 함수목록이 뜨는 것을 확인할 수 있습니다.


그냥 함수 호출은 동기 방식 이기 때문에, 비동기 통신을 설정하여 진행 해보겠습니다.


[고급]을 눌러 비동기 작업을 생성합니다.




다음은 Program.cs 코드 입니다.


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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WCF_CLIENT
{
    public partial class Form1 : Form
    {
        ServiceReference1.ServiceClient Wcf = new ServiceReference1.ServiceClient();
 
        public Form1()
        {
            InitializeComponent();
 
            Wcf.GetTxtCompleted += GetTxtCallback;
            Wcf.GetDTCompleted += GetDtCallback;
        }
 
        /* String 반환 함수 호출 */
        private void button1_Click(object sender, EventArgs e)
        {
            Wcf.GetTxtAsync(); // GetTxt Async 호출
        }
 
        /* DataTable 반환 함수 호출 */
        private void button2_Click(object sender, EventArgs e)
        {
            Wcf.GetDTAsync(); // GetDt Async 호출
        }
 
        /* GetTxt 콜백함수 */
        void GetTxtCallback(object sender, ServiceReference1.GetTxtCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }
 
        /* GetDt 콜백함수 */
        void GetDtCallback(object sender, ServiceReference1.GetDTCompletedEventArgs e)
        {
            MessageBox.Show(e.Result.Rows.Count.ToString() + " 건");
        }
    }
}
 
cs


함수를 호출하고 콜백으로 결과를 받는 구조입니다.


비동기를 잘 쓰면, 여러가지 활용할 수 있습니다.


결과를 확인 해보겠습니다.





간단한, 비동기 WCF 통신 프로그램을 작성해 봤습니다.


이 프로그램을 여러 분야에 활용 가능할 것 같습니다.



'WCF' 카테고리의 다른 글

WCF 통신 바인딩 최대 메시지 크기 (MaxReceivedMessageSize)  (0) 2017.02.20
Comments