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] - <%message>%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>