【问题标题】:Porting 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
【发布时间】:2021-06-16 20:23:34
【问题描述】:

我正在将此服务主机(通过 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"); 
}   

但目前没有渠道进入(.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;
            }
        }
        
        ...
    }

我无法在 .NET Core 中移植此配置:


[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single,
 IncludeExceptionDetailInFaults = true)]  
 

我正在尝试这个:

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;
    }
}

我正在寻找在客户端 (.NET Framework 4.8) 上维持相同行为的最佳策略。

有什么建议吗?

非常感谢。

【问题讨论】:

  • 有什么建议吗? 等到 CoreWCF 可用或坚持使用 Framework 4.8 ... 虽然 .net 核心中有 WCF 的客户端支持(对于某些绑定),但有没有官方支持托管

标签: c# web-services .net-core hosting nettcpbinding


【解决方案1】:

我得到了CoreWCF.Http包: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");                    
            });                             
        }
    }

未实现双工通道。但对我来说很好,为这种不便添加了新代码。

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多