Skip to content

Commit

Permalink
Add integration with Microsoft.Extensions.Configuration for ServiceMo…
Browse files Browse the repository at this point in the history
…del (#7)

* Add integration with Microsoft.Extensions.Configuration
* Added strong typed EndpointAddress
  • Loading branch information
Kralizek authored Oct 10, 2019
1 parent e634459 commit 9f897f4
Show file tree
Hide file tree
Showing 22 changed files with 889 additions and 35 deletions.
30 changes: 30 additions & 0 deletions DotNetUtils.sln
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Hosting.TopShelf", "t
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.ServiceModel", "tests\Tests.ServiceModel\Tests.ServiceModel.csproj", "{96144C47-B5CC-4AB9-8680-65664196BCE2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultipleEndpointsWithConfiguration", "samples\ServiceModel\MultipleEndpointsWithConfiguration\MultipleEndpointsWithConfiguration.csproj", "{CC15444E-6809-4A0D-BAB9-EE4528DF608C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WSHttpService", "samples\ServiceModel\WSHttpService\WSHttpService.csproj", "{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -196,6 +200,30 @@ Global
{96144C47-B5CC-4AB9-8680-65664196BCE2}.Release|x64.Build.0 = Release|Any CPU
{96144C47-B5CC-4AB9-8680-65664196BCE2}.Release|x86.ActiveCfg = Release|Any CPU
{96144C47-B5CC-4AB9-8680-65664196BCE2}.Release|x86.Build.0 = Release|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Debug|x64.ActiveCfg = Debug|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Debug|x64.Build.0 = Debug|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Debug|x86.ActiveCfg = Debug|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Debug|x86.Build.0 = Debug|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Release|Any CPU.Build.0 = Release|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Release|x64.ActiveCfg = Release|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Release|x64.Build.0 = Release|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Release|x86.ActiveCfg = Release|Any CPU
{CC15444E-6809-4A0D-BAB9-EE4528DF608C}.Release|x86.Build.0 = Release|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Debug|x64.ActiveCfg = Debug|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Debug|x64.Build.0 = Debug|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Debug|x86.ActiveCfg = Debug|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Debug|x86.Build.0 = Debug|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Release|Any CPU.Build.0 = Release|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Release|x64.ActiveCfg = Release|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Release|x64.Build.0 = Release|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Release|x86.ActiveCfg = Release|Any CPU
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{22C82327-DA8D-4939-821A-FEFB7A64E172} = {1CDB4B27-C9B2-4946-B17A-25B5264FA245}
Expand All @@ -213,5 +241,7 @@ Global
{B7B1FD18-1DA3-4167-9AEC-8C349ABB6C9C} = {6635F40B-55C6-48B4-9244-63B8C61A1F48}
{68AF28F5-D90A-4E12-A752-0EF5E7D71853} = {6635F40B-55C6-48B4-9244-63B8C61A1F48}
{96144C47-B5CC-4AB9-8680-65664196BCE2} = {6635F40B-55C6-48B4-9244-63B8C61A1F48}
{CC15444E-6809-4A0D-BAB9-EE4528DF608C} = {22C82327-DA8D-4939-821A-FEFB7A64E172}
{A91D1F55-6E15-46A9-B125-EF3BFA36B4EF} = {22C82327-DA8D-4939-821A-FEFB7A64E172}
EndGlobalSection
EndGlobal
7 changes: 5 additions & 2 deletions samples/ServiceModel/BasicHttpService/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using EndpointAddress = EMG.Utilities.ServiceModel.Configuration.EndpointAddress;

namespace Samples.ServiceModel
namespace Samples
{
class Program
{
Expand All @@ -18,7 +19,9 @@ static async Task Main(string[] args)

services.AddWcfService<TestService>(service =>
{
service.AddEndpoint<BasicHttpBinding>(typeof(ITestService), new Uri("http://localhost:10001/test"));
service.AddBasicHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10001, path: "test"));

service.AddSecureBasicHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10002, path: "test"));

service.AddMetadataEndpoints();
});
Expand Down
9 changes: 5 additions & 4 deletions samples/ServiceModel/MultipleEndpoints/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using EndpointAddress = EMG.Utilities.ServiceModel.Configuration.EndpointAddress;

namespace Samples.ServiceModel
namespace Samples
{
class Program
{
Expand All @@ -18,11 +19,11 @@ static async Task Main(string[] args)

services.AddWcfService<TestService>(service =>
{
service.AddNamedPipeEndpoint(typeof(ITestService), new Uri("net.pipe://localhost/test"));
service.AddNamedPipeEndpoint(typeof(ITestService), EndpointAddress.ForNamedPipe("test"));

service.AddBasicHttpEndpoint(typeof(ITestService), new Uri("http://localhost:10001/test"));
service.AddBasicHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10001, path: "test"));

service.AddNetTcpEndpoint(typeof(ITestService), new Uri("net.tcp://localhost:10000"));
service.AddNetTcpEndpoint(typeof(ITestService), EndpointAddress.ForNetTcp(10000));

service.AddMetadataEndpoints();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net47</TargetFramework>
<LangVersion>latest</LangVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\src\ServiceModel\ServiceModel.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
</ItemGroup>

<ItemGroup>
<Reference Include="System.ServiceModel" />
</ItemGroup>

</Project>
78 changes: 78 additions & 0 deletions samples/ServiceModel/MultipleEndpointsWithConfiguration/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading.Tasks;
using EMG.Utilities.ServiceModel;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace Samples
{
class Program
{
static async Task Main(string[] args)
{
var settings = new Dictionary<string, string>
{
// NamedPipe
["Sample:WCF:Endpoints:NamedPipe:Path"] = "test",
// BasicHttp
["Sample:WCF:Endpoints:BasicHttp:Host"] = "localhost",
["Sample:WCF:Endpoints:BasicHttp:Port"] = "10001",
["Sample:WCF:Endpoints:BasicHttp:Path"] = "test",
// NetTcp
["Sample:WCF:Endpoints:NetTcp:Host"] = "localhost",
["Sample:WCF:Endpoints:NetTcp:Port"] = "10000",
["Sample:WCF:Endpoints:NetTcp:Path"] = "test"
};

var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddInMemoryCollection(settings);

var configuration = configurationBuilder.Build();

var services = new ServiceCollection();

services.AddLogging(logging => logging.AddConsole().SetMinimumLevel(LogLevel.Trace));

services.AddWcfService<TestService>(service =>
{
service.AddNamedPipeEndpoint(typeof(ITestService), configuration.GetSection("Sample:WCF:Endpoints:NamedPipe").GetNamedPipeEndpointAddress());

service.AddBasicHttpEndpoint(typeof(ITestService), configuration.GetSection("Sample:WCF:Endpoints:BasicHttp").GetBasicHttpEndpointAddress());

service.AddNetTcpEndpoint(typeof(ITestService), configuration.GetSection("Sample:WCF:Endpoints:NetTcp").GetNetTcpEndpointAddress());

service.AddMetadataEndpoints();
});

var serviceProvider = services.BuildServiceProvider();

var hostedService = serviceProvider.GetService<IHostedService>();

await hostedService.StartAsync(default);

Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();

await hostedService.StopAsync(default);
}
}

[ServiceContract]
public interface ITestService
{
[OperationContract]
Task DoSomethingAsync();
}

public class TestService : ITestService
{
public async Task DoSomethingAsync()
{
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
}
7 changes: 4 additions & 3 deletions samples/ServiceModel/MultipleServices/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using EndpointAddress = EMG.Utilities.ServiceModel.Configuration.EndpointAddress;

namespace Samples.ServiceModel
namespace Samples
{
class Program
{
Expand All @@ -19,14 +20,14 @@ static async Task Main(string[] args)

services.AddWcfService<TestService>(service =>
{
service.AddEndpoint<BasicHttpBinding>(typeof(ITestService), new Uri("http://localhost:10001/test"));
service.AddBasicHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10001, path: "test"));

service.AddMetadataEndpoints();
});

services.AddWcfService<AnotherTestService>(service =>
{
service.AddEndpoint<BasicHttpBinding>(typeof(ITestService), new Uri("http://localhost:10002/test"));
service.AddBasicHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10002, path: "test"));

service.AddMetadataEndpoints();
});
Expand Down
5 changes: 3 additions & 2 deletions samples/ServiceModel/NetNamedPipeService/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using EndpointAddress = EMG.Utilities.ServiceModel.Configuration.EndpointAddress;

namespace Samples.ServiceModel
namespace Samples
{
class Program
{
Expand All @@ -18,7 +19,7 @@ static async Task Main(string[] args)

services.AddWcfService<TestService>(service =>
{
service.AddNamedPipeEndpoint(typeof(ITestService), new Uri("net.pipe://localhost/test"));
service.AddNamedPipeEndpoint(typeof(ITestService), EndpointAddress.ForNamedPipe("test"));
});

var serviceProvider = services.BuildServiceProvider();
Expand Down
5 changes: 3 additions & 2 deletions samples/ServiceModel/NetTcpService/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using EndpointAddress = EMG.Utilities.ServiceModel.Configuration.EndpointAddress;

namespace Samples.ServiceModel
namespace Samples
{
class Program
{
Expand All @@ -18,7 +19,7 @@ static async Task Main(string[] args)

services.AddWcfService<TestService>(service =>
{
service.AddEndpoint<NetTcpBinding>(typeof(ITestService), new Uri("net.tcp://localhost:10000"));
service.AddNetTcpEndpoint(typeof(ITestService), EndpointAddress.ForNetTcp(port: 10000));

service.AddMetadataEndpoints();
});
Expand Down
57 changes: 57 additions & 0 deletions samples/ServiceModel/WSHttpService/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System;
using System.ServiceModel;
using System.Threading.Tasks;
using EMG.Utilities.ServiceModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using EndpointAddress = EMG.Utilities.ServiceModel.Configuration.EndpointAddress;

namespace Samples
{
class Program
{
static async Task Main(string[] args)
{
var services = new ServiceCollection();

services.AddLogging(logging => logging.AddConsole().SetMinimumLevel(LogLevel.Trace));

services.AddWcfService<TestService>(service =>
{
service.AddWSHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10001, path:"test"));

service.AddSecureWSHttpEndpoint(typeof(ITestService), EndpointAddress.ForHttp(port: 10002, path: "test"));

service.AddMetadataEndpoints();
});

var serviceProvider = services.BuildServiceProvider();

var hostedService = serviceProvider.GetService<IHostedService>();

await hostedService.StartAsync(default);

Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();

await hostedService.StopAsync(default);
}
}

[ServiceContract]
public interface ITestService
{
[OperationContract]
Task DoSomethingAsync();
}

public class TestService : ITestService
{
public async Task DoSomethingAsync()
{
await Task.Delay(TimeSpan.FromSeconds(1));
}
}

}
22 changes: 22 additions & 0 deletions samples/ServiceModel/WSHttpService/WSHttpService.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net47</TargetFramework>
<LangVersion>latest</LangVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\src\ServiceModel\ServiceModel.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
</ItemGroup>

<ItemGroup>
<Reference Include="System.ServiceModel" />
</ItemGroup>

</Project>
13 changes: 13 additions & 0 deletions src/ServiceModel/ServiceModel/BindingExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,19 @@ public static BasicHttpBinding WithNoSecurity(this BasicHttpBinding binding)
return binding;
}

public static WSHttpBinding UseHttps(this WSHttpBinding binding, Action<HttpTransportSecurity> configure = null)
{
binding.Security.Mode = SecurityMode.Transport;
configure?.Invoke(binding.Security.Transport);
return binding;
}

public static WSHttpBinding WithNoSecurity(this WSHttpBinding binding)
{
binding.Security.Mode = SecurityMode.None;
return binding;
}

public static NetTcpBinding UseSecureChannel(this NetTcpBinding binding, Action<TcpTransportSecurity> configure = null)
{
binding.Security.Mode = SecurityMode.Transport;
Expand Down
Loading

0 comments on commit 9f897f4

Please sign in to comment.