। নেট কোর ডাব্লুসিএফ প্রতিস্থাপন কি?


96

আমি একটি নেট ফ্রেমওয়ার্ক কনসোল অ্যাপ্লিকেশন তৈরি করতে এবং Add(int x, int y)ক্লাস লাইব্রেরি (। নেট ফ্রেমওয়ার্ক) দিয়ে স্ক্র্যাচ থেকে ডাব্লুসিএফ পরিষেবাটির মাধ্যমে একটি ফাংশন প্রকাশ করতে অভ্যস্ত। আমি তখন সার্ভারের মধ্যে এই ফাংশনটিকে প্রক্সি কল করতে কনসোল অ্যাপ্লিকেশনটি ব্যবহার করি।

তবে আমি যদি কনসোল অ্যাপ (। নেট কোর) এবং একটি ক্লাস লাইব্রেরি (। নেট কোর) সিস্টেমটি ব্যবহার করি Sসেবারমোডেল উপলভ্য নয়। আমি কিছু গুগলিং করেছি তবে এই উদাহরণে ডাব্লুসিএফকে কী "প্রতিস্থাপন" করবে তা আমি খুঁজে পাইনি।

Add(int x, int y)ক্লাস লাইব্রেরির মধ্যে কোনও ফাংশন কীভাবে আমি সমস্ত নেট নেটর মধ্যে কনসোল অ্যাপ্লিকেশনটিতে প্রকাশ করব? আমি সিস্টেম.সোর্সোমোডেল.ওয়েবটি দেখতে পাচ্ছি এবং যেহেতু এটি ক্রস প্ল্যাটফর্ম হওয়ার চেষ্টা করছে আমাকে কি একটি রেস্টস্টুল সার্ভিস তৈরি করতে হবে?


do I have to create a RESTful service?- আফাইক হ্যাঁ (বা কিছু তৃতীয় পক্ষের সমাধান ব্যবহার করুন আমি নেট নেট এর জন্য কোনও কিছুই জানতাম না)
ক্রিস্টোফ ফিঙ্ক

4
ডাব্লুসিএফ সম্ভবত। নেট কোর পোর্ট করা হবে না, কারণ বেশিরভাগ কোড-বেস উইন্ডোজ অভ্যন্তরীণ লাইব্রেরিতে নির্ভর করে। আপনি কি এএসপি.নেট কোর ব্যবহার করতে পারেন? সেখানে আপনার কাছে এমন একটি এইচটিটিপি সার্ভার থাকবে যা সহজেই ক্রস প্ল্যাটফর্ম
ক্যামিলো তেরেভিন্টো

4
ডাব্লুসিএফ ক্লায়েন্ট-সাইড ইতিমধ্যে সমর্থিত (আমি কতটা জানি না), সার্ভার-সাইডটি একটি আলোচিত বিতর্কিত এবং ভোটযুক্ত বৈশিষ্ট্যটির অনুরোধ।
হেন্ক হলটারম্যান

এটি ভিজ্যুয়াল স্টুডিও 2017 15.5-এ উপস্থিত হয় এবং পরে .NET কোর ক্লায়েন্ট প্রক্সি ক্লাস উত্পন্ন করেসমর্থিত বৈশিষ্ট্যগুলির একটি তালিকাও রয়েছে
জ্যামিবারো

উত্তর:


35

উইন্ডোজ নির্দিষ্ট প্রযুক্তি এবং। নেট কোরকে ক্রস প্ল্যাটফর্ম হিসাবে বিবেচনা করার কারণে ডব্লিউসিএফ .NET কোর সমর্থিত নয়।

আপনি যদি আন্ত-প্রক্রিয়া যোগাযোগ বাস্তবায়ন করেন তবে আইপিসি সার্ভিস ফ্রেমওয়ার্ক প্রকল্পটি চেষ্টা করে দেখুন ।

এটি ডাব্লুসিএফ স্টাইলে পরিষেবাগুলি তৈরি করার অনুমতি দেয়:

  1. পরিষেবা চুক্তি তৈরি করুন

    public interface IComputingService
    {
        float AddFloat(float x, float y);
    }
    
  2. পরিষেবাটি কার্যকর করুন

    class ComputingService : IComputingService
    {
        public float AddFloat(float x, float y)
        {
            return x + y;
        }
    }
    
  3. কনসোল অ্যাপ্লিকেশনটিতে পরিষেবাটি হোস্ট করুন

    class Program
    {
        static void Main(string[] args)
        {
            // configure DI
            IServiceCollection services = ConfigureServices(new ServiceCollection());
    
            // build and run service host
            new IpcServiceHostBuilder(services.BuildServiceProvider())
                .AddNamedPipeEndpoint<IComputingService>(name: "endpoint1", pipeName: "pipeName")
                .AddTcpEndpoint<IComputingService>(name: "endpoint2", ipEndpoint: IPAddress.Loopback, port: 45684)
                .Build()
                .Run();
        }
    
        private static IServiceCollection ConfigureServices(IServiceCollection services)
        {
            return services
                .AddIpc()
                .AddNamedPipe(options =>
                {
                    options.ThreadCount = 2;
                })
                .AddService<IComputingService, ComputingService>();
        }
    }
    
  4. ক্লায়েন্ট প্রক্রিয়া থেকে পরিষেবাটি চালু করুন

    IpcServiceClient<IComputingService> client = new IpcServiceClientBuilder<IComputingService>()
        .UseNamedPipe("pipeName") // or .UseTcp(IPAddress.Loopback, 45684) to invoke using TCP
        .Build();
    
    float result = await client.InvokeAsync(x => x.AddFloat(1.23f, 4.56f));
    

4
সুন্দর! । নেট কোর system.io.piplines ব্লগস.এমএসএনএন.মাইক্রোসফট.
2018

দুঃখিত আমি এখানে কিছু গুরুত্বপূর্ণ অনুপস্থিত? পাইপগুলি কেবল একই হোস্ট যোগাযোগের জন্য থাকার কথা নয়?
ব্যবহারকারী 1034912

4
হ্যাঁ, আপনি যা মিস করছেন তা হ'ল এটি সংক্ষেপে প্রমাণ করে যে ডাব্লুসিএফ-এর মতো আইপিসি সার্ভিস ফ্রেমওয়ার্ক আপনাকে বিভিন্ন মেসেজিং প্রযুক্তির মধ্যে বিনা মূল্যে পরিবর্তন করতে দেয়।
ক্রিস এফ ক্যারল 13

4
ডাব্লুসিএফটিকে এমন কিছু প্রোটোকলগুলিতে উইন্ডোজ নির্দিষ্ট হিসাবে বিবেচনা করা যেতে পারে যা এটি বাতিল করে, তবে এসওএপি পরিষেবাগুলি তা নয়। কীভাবে কেউ নেট নেটওয়ার্কে একটি এসওএপি ওয়েব পরিষেবা তৈরি করতে পারে?
জেরেমি

4
দ্রষ্টব্য: এই প্রকল্পের লেখক নিম্নলিখিত মন্তব্যটি লিখেছেন: "বন্ধুরা, ব্যক্তিগত কারণে আমার কয়েক মাস ধরে এই প্রকল্পটি বজায় রাখার সময় নেই Mean এদিকেই। নেট নেট 3.0 জিআরপিসি বৈশিষ্ট্য সহ প্রকাশিত হয়েছে।" ( github.com/jacqueskang/IpcServiceFramework/issues/… )। জিআরপিসির দ্বিতীয় উত্তরটি দেখুন।
জেরার্ড

64

.NET কোর অ্যাপ্লিকেশনটির অভ্যন্তরে ওয়েব পরিষেবা হোস্ট করার জন্য আপনি জিআরপিসি ব্যবহার করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন

ভূমিকা

  1. জিআরপিসি একটি উচ্চ কার্যকারিতা, ওপেন সোর্স আরপিসি ফ্রেমওয়ার্ক প্রাথমিকভাবে গুগল দ্বারা বিকাশিত।
  2. কাঠামোটি দূরবর্তী প্রক্রিয়া কলগুলির একটি ক্লায়েন্ট-সার্ভার মডেলের উপর ভিত্তি করে। কোনও ক্লায়েন্ট অ্যাপ্লিকেশন সরাসরি কোনও সার্ভার অ্যাপ্লিকেশনটিতে পদ্ধতিগুলি কল করতে পারে যেন এটি কোনও স্থানীয় বিষয়।

উদাহরণ

সার্ভার কোড

class Program
{
    static void Main(string[] args)
    {
        RunAsync().Wait();
    }

    private static async Task RunAsync()
    {
        var server = new Grpc.Core.Server
        {
            Ports = { { "127.0.0.1", 5000, ServerCredentials.Insecure } },
            Services =
            {
                ServerServiceDefinition.CreateBuilder()
                    .AddMethod(Descriptors.Method, async (requestStream, responseStream, context) =>
                    {
                        await requestStream.ForEachAsync(async additionRequest =>
                        {
                            Console.WriteLine($"Recieved addition request, number1 = {additionRequest.X} --- number2 = {additionRequest.Y}");
                            await responseStream.WriteAsync(new AdditionResponse {Output = additionRequest.X + additionRequest.Y});
                        });
                    })
                    .Build()
            }
        };

        server.Start();

        Console.WriteLine($"Server started under [127.0.0.1:5000]. Press Enter to stop it...");
        Console.ReadLine();

        await server.ShutdownAsync();
    }
}

ক্লায়েন্ট কোড

class Program
{
    static void Main(string[] args)
    {
        RunAsync().Wait();
    }

    private static async Task RunAsync()
    {
        var channel = new Channel("127.0.0.1", 5000, ChannelCredentials.Insecure);
        var invoker = new DefaultCallInvoker(channel);
        using (var call = invoker.AsyncDuplexStreamingCall(Descriptors.Method, null, new CallOptions{}))
        {
            var responseCompleted = call.ResponseStream
                .ForEachAsync(async response => 
                {
                    Console.WriteLine($"Output: {response.Output}");
                });

            await call.RequestStream.WriteAsync(new AdditionRequest { X = 1, Y = 2});
            Console.ReadLine();

            await call.RequestStream.CompleteAsync();
            await responseCompleted;
        }

        Console.WriteLine("Press enter to stop...");
        Console.ReadLine();

        await channel.ShutdownAsync();
    }
}

ক্লায়েন্ট এবং সার্ভারের মধ্যে ভাগ করা ক্লাস

[Schema]
public class AdditionRequest
{
    [Id(0)]
    public int X { get; set; }
    [Id(1)]
    public int Y { get; set; }
}

[Schema]
public class AdditionResponse
{
    [Id(0)]
    public int Output { get; set; }
}

পরিষেবা বর্ণনাকারী

using Grpc.Core;
public class Descriptors
{
    public static Method<AdditionRequest, AdditionResponse> Method =
            new Method<AdditionRequest, AdditionResponse>(
                type: MethodType.DuplexStreaming,
                serviceName: "AdditonService",
                name: "AdditionMethod",
                requestMarshaller: Marshallers.Create(
                    serializer: Serializer<AdditionRequest>.ToBytes,
                    deserializer: Serializer<AdditionRequest>.FromBytes),
                responseMarshaller: Marshallers.Create(
                    serializer: Serializer<AdditionResponse>.ToBytes,
                    deserializer: Serializer<AdditionResponse>.FromBytes));
}

সিরিয়ালাইজার / ডিসরিওলাইজার

public static class Serializer<T>
{
    public static byte[] ToBytes(T obj)
    {
        var buffer = new OutputBuffer();
        var writer = new FastBinaryWriter<OutputBuffer>(buffer);
        Serialize.To(writer, obj);
        var output = new byte[buffer.Data.Count];
        Array.Copy(buffer.Data.Array, 0, output, 0, (int)buffer.Position);
        return output;
    }

    public static T FromBytes(byte[] bytes)
    {
        var buffer = new InputBuffer(bytes);
        var data = Deserialize<T>.From(new FastBinaryReader<InputBuffer>(buffer));
        return data;
    }
}

আউটপুট

নমুনা ক্লায়েন্ট আউটপুট

নমুনা সার্ভার আউটপুট

তথ্যসূত্র

  1. https://blogs.msdn.microsoft.com/dotnet/2018/12/04/annoucing-net-core-3-preview-1-and-open-sourcing-windows-desktop-frameworks/
  2. https://grpc.io/docs/
  3. https://grpc.io/docs/quickstart/csharp.html
  4. https://github.com/grpc/grpc/tree/master/src/csharp

বেঞ্চমার্ক

  1. http://csharptest.net/787/benchmarking-wcf-compared-to-rpclibrary/index.html

7
মার্চ 2019 পর্যন্ত, এই উত্তরটি আরও প্রাসঙ্গিক। Github.com/grpc/grpc-dotnet (এবং .NET কোর 3.0 এএসপি.নেট কোর আপডেটগুলি দেখুন )।
resnyanskiy

4
আমি মনে করি এটি নিকটতম উত্তর তবে তবুও দুঃখের বিষয়, এটি কোনও আচরণ বা থ্রোটলিং সমর্থন সরবরাহ করে না।
জো

4
এছাড়াও সচেতন থাকুন যে এখন পর্যন্ত gRPCVS 2019 (16.0.2)। নেট নেটিভ সরঞ্জাম চেইনের বিরুদ্ধে সংকলন করে না এবং তাই ইউডাব্লুপি-র সাথে কাজ করবে না।
স্যামুয়েল

4
আপনি যদি নামযুক্ত পাইপ সমর্থন সন্ধান করছেন, আমি একটি জিআরপিসি পরিবহন লিখেছি: github.com/cyanfish/grpc-dotnet-
নামক

4
মনে রাখবেন (2020-04-06 হিসাবে) গ্রাফসি-ডটনেটের এআরএমের জন্য প্যাকেজ নেই।
GafferMan2112

23

দেখে মনে হচ্ছে, মাইক্রোসফ্ট সমর্থন সহ। নেট ফাউন্ডেশন দ্বারা পরিচালিত একটি কোর ডাব্লুসিএফ প্রকল্প থাকবে।

.NET ফাউন্ডেশনে স্বাগত কোর ডব্লুসিএফ- এ আরও বিশদ

প্রাথমিকভাবে কেবল নেটটিসিপি এবং এইচটিপি পরিবহন কার্যকর করা হবে।


এটি একটি বিভ্রান্তিমূলক উত্তর। মাইক্রোসফ্ট কেবল ডাব্লুসিএফ ক্লায়েন্টকে পোর্ট করেছে। ডাব্লুসিএফ হোস্ট বা সার্ভিস হোস্ট উপলভ্য নয় এবং এটি করার কোনও উদ্দেশ্য তাদের নেই। আমি এই কঠিন উপায় শিখেছি। জিআরপিসি হ'ল উপায়
ইউজার 1034912

@ user1034912 আপনি সঠিক নয়। কোর ডাব্লুসিএফ হ'ল লাইটওয়েট ডাব্লুসিএফ সার্ভার যা নেট নেটওয়ার্কে পোর্ট করা হয়। এটির সীমাবদ্ধতা রয়েছে তবে কিছু ক্ষেত্রে এটি একটি ভাল পছন্দ।
অ্যাক্সেস অস্বীকার

হ্যাঁ, আপনি যদি কেবল গ্রাহক হন তবে কোনও
সার্ভিস্ট হস্ট

@ user1034912 না, সার্ভারের দিকটি উপলব্ধ। github.com/CoreWCF/CoreWCF/blob/master/src/Sample/…
অ্যাক্সেস অস্বীকার


9

ডাব্লুসিএফ অনেক কিছুই করে; নামী পাইপ ব্যবহার করে একটি মেশিনে দুটি অ্যাপ্লিকেশন (প্রক্রিয়া) এর মধ্যে দূরবর্তী প্রক্রিয়া কলগুলির সহজ উপায়; এটি TCPIP- র মাধ্যমে বাইনারি সিরিয়ালাইজেশন ব্যবহার করে .NET উপাদানগুলির মধ্যে একটি উচ্চ ভলিউম অভ্যন্তরীণ ক্লায়েন্ট-সার্ভার যোগাযোগ চ্যানেল হতে পারে; অথবা এটি স্ট্যান্ডার্ডাইজড ক্রস-প্রযুক্তি API সরবরাহ করতে পারে, যেমন এসওএপি এর মাধ্যমে। এমনকি এটি এমএসএমকিউর মাধ্যমে অ্যাসিনক্রোনাস মেসেজিংয়ের মতো জিনিসগুলির পক্ষে সমর্থনও রয়েছে।

.NET কোর জন্য, উদ্দেশ্য ভিত্তিক বিভিন্ন প্রতিস্থাপন আছে।

ক্রস-প্ল্যাটফর্ম API এর জন্য, আপনি এএসপি.নেট ব্যবহার করে এটি একটি আরইএসটি পরিষেবা দিয়ে প্রতিস্থাপন করবেন।

আন্তঃ-প্রক্রিয়া সংযোগগুলির জন্য, বা ক্লায়েন্ট-সার্ভার সংযোগের জন্য, জিআরপিসি ভাল হবে, @ গোপির দেওয়া চমৎকার উত্তর সহ with

সুতরাং "কী ডাব্লুসিএফ প্রতিস্থাপন করে" এর উত্তর আপনি কীসের জন্য ব্যবহার করছেন তার উপর নির্ভর করে।


5

এখানে একটি কমিউনিটি রেপো রয়েছে https://github.com/CoreWCF/CoreWCF যা ডাব্লুসিএফের কিছু অংশ প্রয়োগ করে। কিছু সাধারণ ডাব্লুসিএফ পরিষেবাদি সমর্থন করতে আপনি এটি ব্যবহার করতে পারেন। তবে সমস্ত বৈশিষ্ট্য সমর্থিত নয়।


4

সুতরাং আমার গবেষণা থেকে সেরা সমাধানটিতে স্বয়ংক্রিয়ভাবে উত্পাদিত প্রক্সি ক্লাস নেই। এই সর্বোত্তম সমাধানটি হ'ল একটি রেস্টস্টুল সার্ভিস তৈরি করা এবং প্রতিক্রিয়া বডিকে মডেল অবজেক্টে সিরিয়াল করা। যেখানে মডেলগুলি এমভিসি ডিজাইনের প্যাটার্নে পাওয়া সাধারণ মডেল অবজেক্ট।

আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ


4
এখানে দেখুন - ডকস.মাইক্রোসফট
en

হ্যাঁ এটি ছিল স্বয়ংক্রিয়ভাবে উত্সযুক্ত প্রক্সি ক্লাস। আমি এই কার্যকারিতাটির জন্য
RESTful


বিশুদ্ধ দ্বৈত যোগাযোগগুলি সমর্থন করে না
ব্যবহারকারী 1034912

1

আপনি এএসপি.নেট কোর ওয়েব এপিআইও স্ব-হোস্ট করতে পারেন।

<!-- SelfHosted.csproj -->
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <!-- see: https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio#framework-reference -->
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.0" />
  </ItemGroup>

</Project>
// Program.cs
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

namespace SelfHosted
{
    class Program
    {
        static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            // see: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-3.1
            return Host.CreateDefaultBuilder(args)
                .ConfigureHostConfiguration(configHost =>
                {
                    configHost.SetBasePath(Directory.GetCurrentDirectory());
                    configHost.AddJsonFile("appsettings.json", optional: true);
                    configHost.AddEnvironmentVariables(prefix: "SelfHosted_");
                    configHost.AddCommandLine(args);
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.CaptureStartupErrors(true);
                    webBuilder.UseStartup<Startup>();
                });
        }
    }
}
// Startup.cs
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace SelfHosted
{
    public class Startup
    {
        public Startup(IConfiguration configuration, IWebHostEnvironment env)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            // see: https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/web-api/index/samples/3.x
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}
// Controllers\TestController.cs
using System.Net.Mime;
using Microsoft.AspNetCore.Mvc;

namespace SelfHosted.Controllers
{
    [ApiController]
    [Produces(MediaTypeNames.Application.Json)]
    [Route("[controller]")]
    public class HelloController : SelfHostedControllerBase
    {
        [HttpGet]
        public ActionResult<string> HelloWorld() => "Hello World!";

        [HttpGet("{name}")]
        public ActionResult<string> HelloName(string name) => $"Hello {name}!";
    }
}

Asp কোর ওয়েব এপিআই কীভাবে ডাব্লুসিএফ করে এমন একক পোর্টে দ্বৈত যোগাযোগগুলি সমর্থন করে না।
ব্যবহারকারী 1034912

0

.NET কোর পোর্ট উপলব্ধ রয়েছে: https://github.com/dotnet/wcf এটি এখনও পূর্বরূপে রয়েছে তবে তারা সক্রিয়ভাবে এটি বিকাশ করছে।


14
আমি বিশ্বাস করি যে এই বন্দরটি কোর থেকে ডাব্লুসিএফ যোগাযোগের জন্য তবে কোরে ডাব্লুসিএফ লেখার জন্য নয়।
hal9000

7
লিঙ্কযুক্ত গিথুব সংগ্রহশালাটি স্পষ্টভাবে বলেছে: "এই রেপোতে ক্লায়েন্ট-ভিত্তিক ডাব্লুসিএফ লাইব্রেরি রয়েছে যা .NET কোর-এ নির্মিত অ্যাপ্লিকেশনগুলিকে ডাব্লুসিএফ পরিষেবাদির সাথে যোগাযোগ করতে সক্ষম করে" "
বাহা

0

আজকের মতো সমস্ত ডাব্লুসিএফসিওর সেলফহস্ট উপলব্ধ এবং ইনস্টল করা এত সহজ নয়।
হোস্টেড সার্ভিসের জন্য সর্বোত্তম এটি বিকল্প হতে পারে যেমনটি জিআরপিসি পূর্ববর্তী উত্তরে দেখিয়েছিল এবং লক্ষ্য করে যে 1 বছরে অনেকগুলি বিষয় পরিবর্তন হতে পারে নিশ্চিত যে ডাব্লুসিএফ কেবলমাত্র ক্লায়েন্ট হিসাবে কাজ করে যা ঠিক কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.