सिग्नलर .NET .NET क्लाइंट एक Blazor .NET Core 3 एप्लिकेशन में Azure सिग्नलआर सेवा से जुड़ रहा है


11

मैं अपने ASP.NET Core 3.0 Blazor (सर्वर-साइड) एप्लिकेशन और एज़्योर सिग्नलआर सर्विस के बीच संबंध बनाने की कोशिश कर रहा हूं। मैं अपने सिग्नलआर क्लाइंट (सेवा) को कुछ ब्लेज़र घटकों में इंजेक्ट करना समाप्त करूंगा ताकि वे मेरे UI / DOM को रियलटाइम में अपडेट कर सकें।

मेरा मुद्दा यह है कि .StartAsync()हब कनेक्शन पर अपनी विधि को कॉल करने पर मुझे निम्न संदेश मिल रहा है :

प्रतिक्रिया स्थिति कोड सफलता का संकेत नहीं देता है: 404 (नहीं मिला)।

BootstrapSignalRClient.cs

यह फ़ाइल URL, कनेक्शन स्ट्रिंग, कुंजी, विधि नाम और हब नाम सहित सिग्नलआर सेवा के लिए मेरे कॉन्फ़िगरेशन को लोड करती है। इन सेटिंग्स को स्टैटिक क्लास में कैप्चर SignalRServiceConfigurationकिया जाता है और बाद में उपयोग किया जाता है।

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

ठीक है, इसलिए यह पता चलता है कि प्रलेखन में एक महत्वपूर्ण जानकारी का अभाव है। यदि आप Az सिग्नल सिग्नल सेवा से कनेक्ट होने वाले .NET सिग्नलआर क्लाइंट का उपयोग कर रहे हैं, तो आपको हब कनेक्शन बनाते समय एक JWT टोकन का अनुरोध करना होगा और इसे प्रस्तुत करना होगा।

यदि आपको किसी उपयोगकर्ता की ओर से प्रमाणित करने की आवश्यकता है तो आप इस उदाहरण का उपयोग कर सकते हैं

अन्यथा, आप एक JWT टोकन और क्लाइंट URL को पुनः प्राप्त करने के लिए एक Azure फ़ंक्शन जैसे वेब API का उपयोग करके "/ बातचीत" के लिए समापन बिंदु सेट कर सकते हैं; यह वही है जो मैंने अपने उपयोग के मामले के लिए समाप्त किया है। अपने JWT टोकन और URL प्राप्त करने के लिए एक Azure फ़ंक्शन बनाने के बारे में जानकारी यहाँ पाई जा सकती है।

मैंने इन दो मूल्यों को धारण करने के लिए एक वर्ग बनाया:

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एक आधार यूआरएल के साथ पहले से कॉन्फ़िगर और FunctionsClientConstants.SignalR"/ बातचीत" पथ जो आधार URL में जोड़ा जाता के साथ एक स्थिर वर्ग है।

एक बार जब मैंने यह सब सेट किया तो मैंने फोन किया 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)
}

मैंने Azure सिग्नलआर सेवा टीम को दस्तावेज़ीकरण अपडेट प्रदान किया है और आशा है कि यह किसी और की मदद करता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.