সিগন্যালআর। নেট ক্লায়েন্ট একটি ব্লেজার। নেট কোর 3 অ্যাপ্লিকেশনে অ্যাজুরে সিগন্যাল সার্ভিসে সংযুক্ত হচ্ছে


11

আমি আমার এএসপি.নেট কোর 3.0.০ ব্লেজার (সার্ভার-সাইড) অ্যাপ্লিকেশন এবং আজার সিগন্যালআর সার্ভিসের মধ্যে একটি সংযোগ স্থাপনের চেষ্টা করছি। আমি কয়েকটা ব্লেজার উপাদানগুলিতে আমার সিগন্যালআর ক্লায়েন্ট (পরিষেবা) ইনজেকশন শেষ করব যাতে তারা আমার UI / DOM রিয়েলটাইমে আপডেট করে in

আমার সমস্যা .StartAsync()হাব সংযোগে আমার পদ্ধতিটি কল করার সময় আমি নিম্নলিখিত বার্তাটি পেয়েছি :

প্রতিক্রিয়া স্থিতি কোড সাফল্যের ইঙ্গিত দেয় না: 404 (পাওয়া যায়নি)।

BootstrapSignalRClient.cs

এই ফাইলটি ইউআরএল, সংযোগের স্ট্রিং, কী, পদ্ধতির নাম এবং হাবের নাম সহ সিগন্যালআর পরিষেবার জন্য আমার কনফিগারেশনটি লোড করে। এই সেটিংস স্থির শ্রেণিতে বন্দী এবং SignalRServiceConfigurationপরে ব্যবহৃত হয় used

public static class BootstrapSignalRClient
{
    public static IServiceCollection AddSignalRServiceClient(this IServiceCollection services, IConfiguration configuration)
    {
        SignalRServiceConfiguration signalRServiceConfiguration = new SignalRServiceConfiguration();
        configuration.Bind(nameof(SignalRServiceConfiguration), signalRServiceConfiguration);

        services.AddSingleton(signalRServiceConfiguration);
        services.AddSingleton<ISignalRClient, SignalRClient>();

        return services;
    }
}

SignalRServiceConfiguration.cs

public class SignalRServiceConfiguration
{
    public string ConnectionString { get; set; }
    public string Url { get; set; }
    public string MethodName { get; set; }
    public string Key { get; set; }
    public string HubName { get; set; }
}

SignalRClient.cs

public class SignalRClient : ISignalRClient
{
    public delegate void ReceiveMessage(string message);
    public event ReceiveMessage ReceiveMessageEvent;

    private HubConnection hubConnection;

    public SignalRClient(SignalRServiceConfiguration signalRConfig)
    {
        hubConnection = new HubConnectionBuilder()
            .WithUrl(signalRConfig.Url + signalRConfig.HubName)
            .Build();            
    }

    public async Task<string> StartListening(string id)
    {
        // Register listener for a specific id
        hubConnection.On<string>(id, (message) => 
        {
            if (ReceiveMessageEvent != null)
            {
                ReceiveMessageEvent.Invoke(message);
            }
        });

        try
        {
            // Start the SignalR Service connection
            await hubConnection.StartAsync(); //<---I get an exception here
            return hubConnection.State.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }            
    }

    private void ReceiveMessage(string message)
    {
        response = JsonConvert.DeserializeObject<dynamic>(message);
    }
}

.NET কোর যেখানে আপনি এটি যুক্ত করেছেন তাতে সিগন্যালআর ব্যবহার করার অভিজ্ঞতা আমার আছে, সুতরাং অ্যাপ্লিকেশন কনফিগারেশনে একটি হাব Startup.csব্যবহার করে ফাইলটি .AddSignalR().AddAzureSignalR()ম্যাপ করুন এবং এইভাবে করার জন্য নির্দিষ্ট 'কনফিগারেশন' পরামিতিগুলি প্রতিষ্ঠিত হওয়া প্রয়োজন (যেমন সংযোগের স্ট্রিং)।

আমার পরিস্থিতি বিবেচনা করে HubConnectionBuilder, সংকেত স্ট্রিং বা সিগন্যালআর পরিষেবাতে প্রমাণীকরণের জন্য একটি কী পাওয়া যায়?

404 বার্তাটি কী / সংযোগের পাতাগুলি অনুপস্থিত থাকার ফলস্বরূপ?


1
.WithUrl(signalRConfig.Url + signalRConfig.HubName)আপনি যাচাই করতে পারেন এটি সঠিক url এর ফলে হয়? (ব্রেকপয়েন্ট বা লগিংয়ের মাধ্যমে?)
ফিল্ডার

বেসটি উরির মতো হিসাবে পাওয়া Uriএবং উরি (উরি, স্ট্রিং) এর
ফিল্ডার

মজার বিষয় হল এটি 'রেড হেরিং' ছিল এবং 404 এর সাথে কোনও সম্পর্ক ছিল না
জেসন শেভ

উত্তর:


8

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

আপনার যদি কোনও ব্যবহারকারীর পক্ষে প্রমাণীকরণের প্রয়োজন হয় তবে আপনি এই উদাহরণটি ব্যবহার করতে পারেন

অন্যথায়, আপনি আপনার জন্য জেডাব্লুটি টোকেন এবং ক্লায়েন্ট ইউআরএল পুনরুদ্ধার করতে একটি অ্যাজিউর ফাংশন যেমন একটি ওয়েব এপিআই ব্যবহার করে একটি "/ সমঝোতা" শেষ পয়েন্ট সেট আপ করতে পারেন; এটিই আমি আমার ব্যবহারের ক্ষেত্রে শেষ করেছি। আপনার জেডাব্লুটি টোকেন এবং ইউআরএল পেতে একটি অ্যাজুরি ফাংশন তৈরি সম্পর্কিত তথ্য এখানে পাওয়া যাবে।

এই দুটি মান ধরে রাখার জন্য আমি একটি শ্রেণী তৈরি করেছি:

SignalRConnectionInfo.cs

public class SignalRConnectionInfo
{
    [JsonProperty(PropertyName = "url")]
    public string Url { get; set; }
    [JsonProperty(PropertyName = "accessToken")]
    public string AccessToken { get; set; }
}

আমি SignalRServiceআজুরের ওয়েব এপিআইয়ের "/ আলোচনা" শেষ পয়েন্ট, হাব সংযোগের তাত্ক্ষণিককরণ এবং বার্তা প্রাপ্তির জন্য একটি ইভেন্ট + প্রতিনিধি ব্যবহারের সাথে যোগাযোগের জন্য আমার অভ্যন্তরে একটি পদ্ধতিও তৈরি করেছি :

SignalRClient.cs

public async Task InitializeAsync()
{
    SignalRConnectionInfo signalRConnectionInfo;
    signalRConnectionInfo = await functionsClient.GetDataAsync<SignalRConnectionInfo>(FunctionsClientConstants.SignalR);

    hubConnection = new HubConnectionBuilder()
        .WithUrl(signalRConnectionInfo.Url, options =>
        {
           options.AccessTokenProvider = () => Task.FromResult(signalRConnectionInfo.AccessToken);
        })
        .Build();
}

এটি functionsClientহ'ল HttpClientএকটি বেস ইউআরএল সহ একটি দৃ typ়ভাবে টাইপিত পূর্ব-কনফিগার করা এবং FunctionsClientConstants.SignalRএটি "/ আলোচনার" পথে একটি স্ট্যাটিক শ্রেণি যা বেস ইউআরএলে সংযুক্ত হয়।

একবার এই সমস্ত সেট আপ হয়ে গেলে আমি ডেকেছিলাম await hubConnection.StartAsync();এবং এটি "সংযুক্ত"!

এত ReceiveMessageকিছুর পরেও আমি একটি স্থির ইভেন্ট এবং নিম্নলিখিত হিসাবে একই প্রতিনিধি স্থাপন করেছি (একইভাবে SignalRClient.cs):

public delegate void ReceiveMessage(string message);
public static event ReceiveMessage ReceiveMessageEvent;

শেষ অবধি, আমি ReceiveMessageপ্রতিনিধিটি প্রয়োগ করেছি :

await signalRClient.InitializeAsync(); //<---called from another method

private async Task StartReceiving()
{
    SignalRStatus = await signalRClient.ReceiveReservationResponse(Response.ReservationId);
    logger.LogInformation($"SignalR Status is: {SignalRStatus}");

    // Register event handler for static delegate
    SignalRClient.ReceiveMessageEvent += signalRClient_receiveMessageEvent;
}

private async void signalRClient_receiveMessageEvent(string response)
{
    logger.LogInformation($"Received SignalR mesage: {response}");
    signalRReservationResponse = JsonConvert.DeserializeObject<SignalRReservationResponse>(response);
    await InvokeAsync(StateHasChanged); //<---used by Blazor (server-side)
}

আমি আজুর সিগন্যালআর সার্ভিস টিমের কাছে ডকুমেন্টেশন আপডেটগুলি সরবরাহ করেছি এবং নিশ্চিত আশা করি এটি অন্য কাউকে সহায়তা করে!

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