■ MTOM을 사용해 대용량 메시지를 보내는 방법을 보여준다.
[TestServer 프로젝트]
▶ IDownloadService.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 |
using System.ServiceModel; namespace TestServer { /// <summary> /// 다운로드 서비스 /// </summary> [ServiceContract] public interface IDownloadService { //////////////////////////////////////////////////////////////////////////////////////////////////// Method #region 문서 다운로드 하기 - DownloadDocument(filePath) /// <summary> /// 문서 다운로드 하기 /// </summary> /// <param name="filePath">파일 경로</param> /// <returns>다운로드 파일</returns> [OperationContract] DownloadFile DownloadDocument(string filePath); #endregion } } |
▶ DownloadService.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 |
using System.IO; namespace TestServer { /// <summary> /// 다운로드 서비스 /// </summary> public class DownloadService : IDownloadService { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 문서 다운로드 하기 - DownloadDocument(filePath) /// <summary> /// 문서 다운로드 하기 /// </summary> /// <param name="filePath">파일 경로</param> /// <returns>다운로드 파일</returns> public DownloadFile DownloadDocument(string filePath) { string fileName = Path.GetFileName(filePath); DownloadFile downloadFile = new DownloadFile(); downloadFile.FileName = fileName; downloadFile.Content = File.ReadAllBytes(filePath); return downloadFile; } #endregion } } |
▶ 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 |
using System; using System.ServiceModel; namespace TestServer { /// <summary> /// 프로그램 /// </summary> class Program { ////////////////////////////////////////////////////////////////////////////////////////// Method //////////////////////////////////////////////////////////////////////////////// Static ////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { using(ServiceHost serviceHost = new ServiceHost(typeof(DownloadService))) { serviceHost.Open(); Console.WriteLine("서버가 시작되었습니다 : " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.ReadKey(true); } } #endregion } } |
▶ App.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 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="wsHttp" messageEncoding="Mtom" maxReceivedMessageSize="1073741824"> <readerQuotas maxArrayLength="1073741824"/> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="mexBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="TestServer.DownloadService" behaviorConfiguration="mexBehavior"> <endpoint address="DownloadService" binding="wsHttpBinding" bindingConfiguration="wsHttp" contract="TestServer.IDownloadService" /> <host> <baseAddresses> <add baseAddress="http://localhost:8080" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration> |
[TestClient 프로젝트]
▶ MainForm.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 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using System; using System.Windows.Forms; using TestClient.DownloadService; namespace TestClient { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.downloadButton.Click += downloadButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 다운로드 버튼 클릭시 처리하기 - downloadButton_Click(sender, e) /// <summary> /// 다운로드 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void downloadButton_Click(object sender, EventArgs e) { string downloadFilePath = this.downloadFilePathTextBox.Text.Trim(); if(string.IsNullOrEmpty(downloadFilePath)) { MessageBox.Show("다운로드 파일 경로를 입력해 주시기 바랍니다."); return; } using(DownloadServiceClient client = new DownloadServiceClient("WSHttpBinding_IDownloadService")) { DownloadFile downloadFile = client.DownloadDocument(downloadFilePath); MessageBox.Show("다운로드를 완료했습니다 : " + downloadFile.FileName); } } #endregion } } |
▶ App.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 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IDownloadService" messageEncoding="Mtom" maxReceivedMessageSize="1073741824"> <readerQuotas maxArrayLength="1073741824"/> </binding> </wsHttpBinding> </bindings> <client> <endpoint name="WSHttpBinding_IDownloadService" address="http://localhost:8080/DownloadService" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDownloadService" contract="DownloadService.IDownloadService" /> </client> </system.serviceModel> </configuration> |