I'm porting this service host (over TCP, non Web) from .NET Framework 4.8 to .NET Core 3.1:
using (this._host = new ServiceHost(_receiver, new Uri("net.tcp://localhost:8065")))
{
this._host.OpenTimeout = TimeSpan.FromMinutes(5);
this._host.CloseTimeout = TimeSpan.FromMinutes(5);
var binding = new NetTcpBinding
{
CloseTimeout = TimeSpan.FromSeconds(15),
OpenTimeout = TimeSpan.FromSeconds(15),
SendTimeout = TimeSpan.FromSeconds(15),
ReceiveTimeout = TimeSpan.FromSeconds(15);
};
this._host.AddServiceEndpoint(typeof(IMessageReceiver), binding, "ISubscribe");
}
But there are not channel to get in this point (old code in .NET Framework 4.8):
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single,
IncludeExceptionDetailInFaults = true)]
public class MessageReceiver : IMessageReceiver
{
...
public bool Subscribe()
{
try
{
IMessageSender callback = OperationContext.Current.GetCallbackChannel<IMessageSender>();
if (!_subscribers.Contains(callback))
{
_subscribers.Add(callback);
Console.WriteLine("Subscriber");
}
return true;
}
catch (Exception e)
{
Console.WriteLine("Subscribe Exception" + e.ToString());
return false;
}
}
...
}
And i can't port this configuration in .NET Core:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single,
IncludeExceptionDetailInFaults = true)]
I'm trying with this:
public static IWebHostBuilder CreateHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddMessageReceiverFramework(new IPEndPoint(IPAddress.Any, 8065));
})
.UseUrls("net.tcp://localhost:8065/ISubscribe")
.UseStartup<Startup>();
public static class MessageReceiverExtensionsAux
{
public static IServiceCollection AddMessageReceiverFramework(this IServiceCollection services,
IPEndPoint endPoint)
{
services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<KestrelServerOptions>,
MessageReceiverOptionsSetup>());
services.Configure<MessageReceiverOptions>(o =>
{
o.EndPoint = endPoint;
});
services.TryAddSingleton<IMessageReceiver, MessageReceiver>();
return services;
}
}
I looking for best strategy for mantening same behavior on client side (.NET Framework 4.8).
Any suggestion?
Very thanks.
I got CoreWCF.Http package: https://github.com/CoreWCF/CoreWCF
Not implement duplex channel. But is good to me, whith new code for this inconvenience.