Use IConnectionEndPointFeature to get IMqttChannelAdapter.Endpoint in aspnetcore31release/3.x.x
@@ -25,7 +25,7 @@ namespace MQTTnet.AspNetCore | |||
_input = Connection.Transport.Input; | |||
_output = Connection.Transport.Output; | |||
} | |||
_reader = new SpanBasedMqttPacketBodyReader(); | |||
} | |||
@@ -37,6 +37,12 @@ namespace MQTTnet.AspNetCore | |||
{ | |||
get | |||
{ | |||
#if NETCOREAPP3_1 | |||
if (Connection?.RemoteEndPoint != null) | |||
{ | |||
return Connection.RemoteEndPoint.ToString(); | |||
} | |||
#endif | |||
var connection = Http?.HttpContext?.Connection; | |||
if (connection == null) | |||
{ | |||
@@ -1,7 +1,7 @@ | |||
<Project Sdk="Microsoft.NET.Sdk"> | |||
<PropertyGroup> | |||
<TargetFramework>netcoreapp3.1</TargetFramework> | |||
<TargetFrameworks>netcoreapp3.1;net461</TargetFrameworks> | |||
<IsPackable>false</IsPackable> | |||
</PropertyGroup> | |||
@@ -11,6 +11,12 @@ | |||
<PackageReference Include="MSTest.TestFramework" Version="2.1.1" /> | |||
</ItemGroup> | |||
<ItemGroup Condition=" '$(TargetFramework)' != 'netcoreapp3.1' "> | |||
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.1.1" /> | |||
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.1.1" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="..\..\Source\MQTTnet.AspnetCore\MQTTnet.AspNetCore.csproj" /> | |||
<ProjectReference Include="..\MQTTnet.Core.Tests\MQTTnet.Tests.csproj" /> | |||
@@ -0,0 +1,50 @@ | |||
using Microsoft.AspNetCore.Connections; | |||
using MQTTnet.Adapter; | |||
using MQTTnet.Formatter; | |||
using MQTTnet.Server; | |||
using System; | |||
using System.Threading.Tasks; | |||
namespace MQTTnet.AspNetCore.Tests.Mockups | |||
{ | |||
public class ConnectionHandlerMockup: IMqttServerAdapter | |||
{ | |||
public TaskCompletionSource<MqttConnectionContext> Context { get; } = new TaskCompletionSource<MqttConnectionContext>(); | |||
public Func<IMqttChannelAdapter, Task> ClientHandler { get; set; } | |||
public ConnectionHandlerMockup() | |||
{ | |||
} | |||
public async Task OnConnectedAsync(ConnectionContext connection) | |||
{ | |||
try | |||
{ | |||
var writer = new SpanBasedMqttPacketWriter(); | |||
var formatter = new MqttPacketFormatterAdapter(writer); | |||
var context = new MqttConnectionContext(formatter, connection); | |||
Context.TrySetResult(context); | |||
await ClientHandler(context); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Context.TrySetException(ex); | |||
} | |||
} | |||
public Task StartAsync(IMqttServerOptions options) | |||
{ | |||
return Task.CompletedTask; | |||
} | |||
public Task StopAsync() | |||
{ | |||
return Task.CompletedTask; | |||
} | |||
public void Dispose() | |||
{ | |||
} | |||
} | |||
} |
@@ -1,13 +1,20 @@ | |||
using Microsoft.AspNetCore.Connections; | |||
using Microsoft.AspNetCore.Builder; | |||
using Microsoft.AspNetCore.Connections; | |||
using Microsoft.AspNetCore.Hosting; | |||
using Microsoft.Extensions.DependencyInjection; | |||
using Microsoft.VisualStudio.TestTools.UnitTesting; | |||
using MQTTnet.AspNetCore.Tests.Mockups; | |||
using MQTTnet.Exceptions; | |||
using MQTTnet.Packets; | |||
using System; | |||
using System.Linq; | |||
using System.Threading; | |||
using System.Threading.Tasks; | |||
using MQTTnet.Adapter; | |||
using MQTTnet.AspNetCore.Tests.Mockups; | |||
using MQTTnet.Client.Options; | |||
using MQTTnet.Exceptions; | |||
using MQTTnet.Formatter; | |||
using MQTTnet.Packets; | |||
using System.Net; | |||
namespace MQTTnet.AspNetCore.Tests | |||
{ | |||
@@ -63,5 +70,43 @@ namespace MQTTnet.AspNetCore.Tests | |||
var readResult = await pipe.Send.Reader.ReadAsync(); | |||
Assert.IsTrue(readResult.Buffer.Length > 20000); | |||
} | |||
private class Startup | |||
{ | |||
public void Configure(IApplicationBuilder app) | |||
{ | |||
} | |||
} | |||
[TestMethod] | |||
public async Task TestEndpoint() | |||
{ | |||
var mockup = new ConnectionHandlerMockup(); | |||
using (var host = new WebHostBuilder() | |||
.UseKestrel(kestrel => kestrel.ListenLocalhost(1883, listener => listener.Use((ctx, next) => mockup.OnConnectedAsync(ctx)))) | |||
.UseStartup<Startup>() | |||
.ConfigureServices((hostContext, services) => | |||
{ | |||
services.AddHostedMqttServer(o => o.WithoutDefaultEndpoint()); | |||
services.AddSingleton<IMqttServerAdapter>(mockup); | |||
}) | |||
.Build()) | |||
using (var client = new MqttFactory().CreateMqttClient()) | |||
{ | |||
host.Start(); | |||
await client.ConnectAsync(new MqttClientOptionsBuilder() | |||
.WithTcpServer("localhost") | |||
.Build(), CancellationToken.None); | |||
var ctx = await mockup.Context.Task; | |||
#if NETCOREAPP3_1 | |||
var ep = IPEndPoint.Parse(ctx.Endpoint); | |||
Assert.IsNotNull(ep); | |||
#endif | |||
Assert.IsNotNull(ctx); | |||
} | |||
} | |||
} | |||
} |