형관봇
WCF 비동기 통신 서비스 만들기 본문
클라이언트 프로그램 내에서 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 |
---|