Soap Server with WCF (wsdl, msgLog)

원서연·2025년 5월 15일

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;

namespace SimpleSoapServer
{
    internal class Program
    {
        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger("simpleLogger");

        static void Main(string[] args)
        {
            logger.Info("Program is started");

            using (ServiceHost svcHost = new ServiceHost(typeof(Calculator)))
            {
                foreach (ServiceEndpoint sep in svcHost.Description.Endpoints)
                {
                    sep.EndpointBehaviors.Add(new LogEndpointBehavior(logger));
                }

                svcHost.Open();

                logger.Info("==========Start Server==========");

                Console.WriteLine("Simple Soap Server is running...");
                Console.WriteLine("Press <Any Key> to terminate program.");
                Console.WriteLine();
                Console.ReadKey();

                logger.Info("==========Terminate Server==========");
            }
        }
    }
}

SimpleSoapServer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;

namespace SimpleSoapServer
{
    public class LogEndpointBehavior : IEndpointBehavior
    {
        private readonly log4net.ILog logger = null;

        public LogEndpointBehavior(log4net.ILog logger)
        {
            this.logger = logger;
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new LogMessageInspector(logger));
        }
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { }
        public void Validate(ServiceEndpoint endpoint) { }
    }

    public class LogMessageInspector : IDispatchMessageInspector
    {
        private readonly log4net.ILog logger = null;

        public LogMessageInspector(log4net.ILog logger)
        {
            this.logger = logger;
        }

        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            string requestMessage = request.ToString();
            logger.Info($"RECV SOAP : DATA=[{requestMessage}]");

            return null;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            string replyMessage = reply.ToString();
            logger.Info($"SEND SOAP : DATA=[{replyMessage}]");
        }
    }
}

log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<log4net>

		<logger name="simpleLogger">
			<level value="INFO" />
			<appender-ref ref="file" />
		</logger>
		
		<appender name="file" type="log4net.Appender.RollingFileAppender">
			<rollingStyle value="Composite" />
			<staticLogFileName value="false" />
			<file value="log\SIMPLE\SIMPLE_" />
			<datePattern value="yyyy-MM-dd-HH'.log'"/>
			<appendToFile value="true" />
			<maxSizeRollBackups value="15" />
			<maximumFileSize value="100MB" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.fff} [%5level][Thread : %thread] - &lt;%message&gt;%newline" />
			</layout>
		</appender>
		
	</log4net>
</configuration>

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<system.serviceModel>

		<services>
			<service name="SimpleSoapServer.Calculator" behaviorConfiguration="SimpleBehavior">
				<host>
					<baseAddresses>
						<add baseAddress="http://127.0.0.1:8002/SimpleSoapServer/Calculator"/>
					</baseAddresses>
				</host>
				<endpoint contract="SimpleSoapServer.ICalculator" binding="basicHttpBinding" address="http://127.0.0.1:8001/SimpleSoapServer/Calculator" />
				<endpoint contract="SimpleSoapServer.ICalculator" binding="wsHttpBinding"    address="http://127.0.0.1:8002/SimpleSoapServer/Calculator" />
				<endpoint contract="SimpleSoapServer.ICalculator" binding="netTcpBinding" address="net.tcp://127.0.0.1:8003/SimpleSoapServer/Calculator" />
			</service>
		</services>

		<behaviors>
			<serviceBehaviors>
				<behavior name="SimpleBehavior">
					<serviceMetadata httpGetEnabled="true" />
					<serviceDebug includeExceptionDetailInFaults="true"/>
				</behavior>
			</serviceBehaviors>
		</behaviors>
		
	</system.serviceModel>
</configuration>

0개의 댓글