简体   繁体   English

将服务主机(通过 TCP,非 Web)从 .NET Framework 4.8 移植到 .NET Core 3.1

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

I'm porting this service host (over TCP, non Web) from .NET Framework 4.8 to .NET Core 3.1:我正在将此服务主机(通过 TCP,非 Web)从 .NET Framework 4.8 移植到 .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):但是此时没有渠道可以进入(.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:而且我无法在 .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).我正在寻找在客户端(.NET Framework 4.8)上维护相同行为的最佳策略。

Any suggestion?有什么建议吗?

Very thanks.很感谢。

I got CoreWCF.Http package: https://github.com/CoreWCF/CoreWCF我得到了 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.但对我来说很好,为这种不便添加了新代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将 .NET Core 3.1 API web 应用程序作为 Z0F4137ED1502B5045426083AA258 服务托管? - How to host a .NET Core 3.1 API web application as windows service? 如何在asp.net core 3.1中使用asp.net framework 4.8中的StatisticFormula类 - How can I use a StatisticFormula Class from asp.net framework 4.8 in asp.net core 3.1 将 NLog 注册为 dot net core 3.1 中非特定主机的记录器 - Registering NLog as logger for non specific host in dot net core 3.1 .NET 4.8 中的异步等待递归导致 StackoverflowException(不在.Net Core 3.1 中!) - Async Await Recursion in .NET 4.8 causes StackoverflowException (not in .Net Core 3.1!) ASP.NET 核心3.1:添加框架服务:IHostEnvironment - ASP.NET Core 3.1: Add framework service: IHostEnvironment 如何从 .NET Framework 4.6 迁移到 .NET Core 3.1 - How to migrate from .NET Framework 4.6 to .NET Core 3.1 如何在 .NET Core 3.1 中调用 WCF web 服务? - How do I call a WCF web service in .NET Core 3.1? .net 核心 3.1 Web API 托管为 ZAEA23489CE3AA9B6406EBB28E0CDA 服务未显示页面 - .net core 3.1 Web API hosting as Windows Service not showing pages .Net Core 3.0通过反射调用.Net Framework 4.8程序 - .Net Core 3.0 invoking .Net Framework 4.8 program via Reflection 如何创建或使用现成的Shims从.net框架移植到.net核心/标准? - How to create or use ready Shims for porting from .net framework to .net core / standard?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM