Porting service host (over TCP, non Web) from .NET Framework 4.8 to .NET Core 3.1

1.5k Views Asked by At

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.

1

There are 1 best solutions below

2
Mateus Hoffmann On

I got CoreWCF.Http package: https://github.com/CoreWCF/CoreWCF

   using CoreWCF; 
   using CoreWCF.Configuration;

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
     .ConfigureServices(services =>
     {
        ...        
        
     }).UseKestrel(options => {
         
         options.ListenLocalhost(8080);
       
     }).UseNetTcp(8808)
       .UseStartup<Startup>();
     

    public class Startup
    {             
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddServiceModelServices();                            
        }
        public void Configure(IApplicationBuilder app, IHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseServiceModel(builder =>
            {
                var bind = new NetTcpBinding(); 
                 
                builder
                .AddService<MessageReceiver>()
                .AddServiceEndpoint<MessageReceiver>(typeof(IMessageReceiver),bind, "/nettcp");                    
            });                             
        }
    }

Not implement duplex channel. But is good to me, whith new code for this inconvenience.