সিগন্যালআর - (আইউসারআইডিপ্রাইডার) * নতুন 2.0.0 * ব্যবহার করে নির্দিষ্ট ব্যবহারকারীর কাছে একটি বার্তা প্রেরণ


103

Asp.Net SignalR এর সর্বশেষ সংস্করণে, "IUserIdProvider" ইন্টারফেসটি ব্যবহার করে একটি নির্দিষ্ট ব্যবহারকারীর কাছে একটি বার্তা প্রেরণের একটি নতুন উপায় যুক্ত করা হয়েছিল।

public interface IUserIdProvider
{
   string GetUserId(IRequest request);
}

public class MyHub : Hub
{
   public void Send(string userId, string message)
   {
      Clients.User(userId).send(message);
   }
}

আমার প্রশ্ন: আমি কীভাবে জানব যে আমি আমার বার্তাটি পাঠাচ্ছি? এই নতুন পদ্ধতির ব্যাখ্যাটি খুব উচ্চমানের। এবং এই বাগ সহ সিগন্যালআর ২.০.০ এর খসড়া বিবৃতি এবং সংকলন করে না। কেউ কি এই বৈশিষ্ট্যটি প্রয়োগ করেছেন?

আরও তথ্য: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users- to-connitions# IUserIdProvider

আলিঙ্গন।


4
আপনাকে সিগন্যালআর দিয়ে প্রমাণীকরণ এবং অনুমোদনের দিকে নজর দেওয়া দরকার। ইউজারআইডি আইপিআরসিস্ট্যানাল সরবরাহকারীর অংশ হবে।
Gjohn

উত্তর:


156

প্রতিটি সংযোগের জন্য সিগন্যালআর সংযোগআইড সরবরাহ করে। কোন সংযোগটি কার (ব্যবহারকারী) এর সাথে সম্পর্কিত তা আবিষ্কার করার জন্য আমাদের সংযোগ এবং ব্যবহারকারীর মধ্যে একটি ম্যাপিং তৈরি করতে হবে। এটি আপনার অ্যাপ্লিকেশনটিতে কোনও ব্যবহারকারীকে কীভাবে চিহ্নিত করবেন তার উপর নির্ভর করে।

সিগন্যালআর ২.০ এ, এটি ইনবিল্ট ব্যবহার করে করা হয় IPrincipal.Identity.Nameযা এএসপি.এনইটি প্রমাণীকরণের সময় সেট হিসাবে লগইন হওয়া ব্যবহারকারী শনাক্তকারী।

তবে আপনার পরিচয়.নামটি ব্যবহার না করে আলাদা পরিচয়কারক ব্যবহার করে ব্যবহারকারীর সাথে সংযোগটি মানচিত্রের প্রয়োজন হতে পারে। এই উদ্দেশ্যে এই নতুন সরবরাহকারীর সাথে সংযোগটি সহ ব্যবহারকারীকে ম্যাপিংয়ের জন্য আপনার কাস্টম প্রয়োগের সাথে ব্যবহার করা যেতে পারে।

IUserIdProvider ব্যবহার করে সংযোগগুলিতে সিগন্যাল ব্যবহারকারীদের ম্যাপিংয়ের উদাহরণ

ধরে নেওয়া যাক userIdপ্রতিটি ব্যবহারকারীর সনাক্তকরণের জন্য আমাদের অ্যাপ্লিকেশনটি একটি ব্যবহার করে । এখন, আমাদের নির্দিষ্ট ব্যবহারকারীর কাছে বার্তা প্রেরণ করা দরকার। আমাদের রয়েছে userIdএবং messageতবে সিগন্যালআর অবশ্যই আমাদের ইউজারআইডি এবং সংযোগের মধ্যে ম্যাপিংটি জানতে হবে।

এটি অর্জনের জন্য প্রথমে আমাদের একটি নতুন শ্রেণি তৈরি করা দরকার যা প্রয়োগ করে IUserIdProvider:

public class CustomUserIdProvider : IUserIdProvider
{
     public string GetUserId(IRequest request)
    {
        // your logic to fetch a user identifier goes here.

        // for example:

        var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name);
        return userId.ToString();
    }
}

দ্বিতীয় পদক্ষেপটি সিগন্যালআরকে CustomUserIdProviderডিফল্ট প্রয়োগের পরিবর্তে আমাদের ব্যবহার করতে বলুন । হাব কনফিগারেশন আরম্ভ করার সময় এটি স্টার্টআপ.কে করা যেতে পারে:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var idProvider = new CustomUserIdProvider();

        GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);          

        // Any connection or hub wire up and configuration should go here
        app.MapSignalR();
    }
}

এখন, আপনি কোনও নির্দিষ্ট ব্যবহারকারীর userIdনথিটিতে উল্লিখিত হিসাবে ব্যবহার করে বার্তা পাঠাতে পারেন , যেমন:

public class MyHub : Hub
{
   public void Send(string userId, string message)
   {
      Clients.User(userId).send(message);
   }
}

আশাকরি এটা সাহায্য করবে.


হাই বন্ধু, দেরী মতামত জন্য দুঃখিত! তবে আমি আইডিটি অ্যাক্সেস করার চেষ্টা করেছি যা কাস্টম ইউজারআইডিপ্রভাইডার উত্পন্ন করে তবে "অনকনেক্টেড" পদ্ধতিটি একই নয়। আমি কীভাবে ডাটাবেসে কোনও ব্যবহারকারীর সাথে লিঙ্ক করব? ধন্যবাদ!
ইগর

7
মাই কাস্টম ইউজারক্লাস কী?
ড্যানি বুলিস

4
"মাইকাস্টমউসারক্লাস" হতে পারে আপনার কাস্টম ব্যবহারকারীর শ্রেণি যা ফাইন্ডইউজারআইডি পদ্ধতি ধারণ করে। এটি কেবল উদাহরণস্বরূপ। আপনার যে কোনও ক্লাসে এমন কোনও পদ্ধতি থাকতে পারে যা আপনাকে ইউজারআইডি দেয় এবং এটি এখানে ব্যবহার করে।
সুমন্ত

5
ধন্যবাদ @ সুমান্ট, আমার সমস্যাটি শেষ হয়েছে যে খ / সি আমি একটি ওয়েব এপিআই প্রকল্পে ছিলাম যেখানে আমি বহনকারী টোকেন সহ OAuth 2 বাস্তবায়ন করেছি আমাকে ক্যারিয়ার স্ট্রিংয়ে বাহক টোকেন পাস করার জন্য যুক্তি প্রয়োগ করতে হয়েছিল কারণ এটি থেকে টানা যায় না প্রাথমিক সংকেত সংযোগের অনুরোধের শিরোনামগুলি। কেবল অনুরোধটি ব্যবহার করতে পারেনি
ser

4
@ সুমেন্ট আমি ইতিমধ্যে এটি সমাধান করেছি। সমস্যাটি হ'ল আমি app.MapSignalR();প্রমাণীকরণের আগে গ্লোবাল.এক্সএক্সে রাখি।
মিঃ রোবট

38

এখানে একটি সূচনা .. পরামর্শ / উন্নতির জন্য খুলুন।

সার্ভার

public class ChatHub : Hub
{
    public void SendChatMessage(string who, string message)
    {
        string name = Context.User.Identity.Name;
        Clients.Group(name).addChatMessage(name, message);
        Clients.Group("2@2.com").addChatMessage(name, message);
    }

    public override Task OnConnected()
    {
        string name = Context.User.Identity.Name;
        Groups.Add(Context.ConnectionId, name);

        return base.OnConnected();
    }
}

জাভাস্ক্রিপ্ট

( উপরের সার্ভার কোডের পদ্ধতিগুলি কীভাবে addChatMessageএবং কীভাবে তা লক্ষ্য করুন sendChatMessage)

    $(function () {
    // Declare a proxy to reference the hub.
    var chat = $.connection.chatHub;
    // Create a function that the hub can call to broadcast messages.
    chat.client.addChatMessage = function (who, message) {
        // Html encode display name and message.
        var encodedName = $('<div />').text(who).html();
        var encodedMsg = $('<div />').text(message).html();
        // Add the message to the page.
        $('#chat').append('<li><strong>' + encodedName
            + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
    };

    // Start the connection.
    $.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
            // Call the Send method on the hub.
            chat.server.sendChatMessage($('#displayname').val(), $('#message').val());
            // Clear text box and reset focus for next comment.
            $('#message').val('').focus();
        });
    });
});

পরীক্ষামূলক এখানে চিত্র বর্ণনা লিখুন


হাই বন্ধু, দেরী মতামত জন্য দুঃখিত! তবে আমি কীভাবে সংযোগের ক্ষতি রোধ করতে পারি? ধন্যবাদ.
ইগোর

5
@ লিগাও আমার কোনও ধারণা নেই।
মাফিন ম্যান

কেন এই লাইনের প্রয়োজন ছিল --- ক্লায়েন্টস.গ্রুপ ("2@2.com") add চ্যাটমেসেজ (নাম, বার্তা); ??
টমাস

@ থমাস আমি সম্ভবত এটি ডেমো এর খাতিরে অন্তর্ভুক্ত করেছি। একটি নির্দিষ্ট গ্রুপে সম্প্রচার করার জন্য আরও একটি উপায় থাকতে হবে কারণ এটি হার্ডকোডযুক্ত ছিল।
মাফিন ম্যান

একটি নির্দিষ্ট লগ করা ব্যবহারকারীর কাছে একটি বার্তা প্রেরণের জন্য এই সহজ সমাধানটি আমার সমস্যার সমাধান করেছে। এটি সহজ, দ্রুত এবং সহজে বোঝা যায়। আমি যদি উত্তর দিতে পারি তবে কয়েকবার এই উত্তরটি উত্সাহিত করব।
রাফায়েল এএমএস

6

নির্দিষ্ট ব্যবহারকারীকে (কোনও সরবরাহকারী ব্যবহার না করে) টার্গেট করতে এভাবেই সাইনারআর ব্যবহার করুন:

 private static ConcurrentDictionary<string, string> clients = new ConcurrentDictionary<string, string>();

 public string Login(string username)
 {
     clients.TryAdd(Context.ConnectionId, username);            
     return username;
 }

// The variable 'contextIdClient' is equal to Context.ConnectionId of the user, 
// once logged in. You have to store that 'id' inside a dictionaty for example.  
Clients.Client(contextIdClient).send("Hello!");

4
আপনি এটি কীভাবে ব্যবহার করছেন contextIdClientতা এটি পেল না :(
নিও

2

বৈশিষ্ট্যের জন্য সিগন্যালআর টেস্টগুলি দেখুন ।

"সেন্ডটোজার" পরীক্ষাটি নিয়মিত owin প্রমাণীকরণ লাইব্রেরি ব্যবহার করে স্বয়ংক্রিয়ভাবে ব্যবহারকারীর পরিচয় গৃহীত হয়।

দৃশ্যটি হ'ল আপনার এমন একজন ব্যবহারকারী আছেন যিনি একাধিক ডিভাইস / ব্রাউজারগুলি থেকে সংযুক্ত হয়েছেন এবং আপনি তার সমস্ত সক্রিয় সংযোগগুলিতে একটি বার্তা চাপতে চান।


ধন্যবাদ মানুষ! কিন্তু প্রকল্প সংস্করণ 2.0 এখানে সংকেত তৈরি করছে না। : (দুর্ভাগ্যক্রমে আমি এটিতে অ্যাক্সেস করতে পারি না
ইগোর

0

পুরানো থ্রেড, তবে সবেমাত্র একটি নমুনায় এটি জুড়ে এসেছে:

services.AddSignalR()
            .AddAzureSignalR(options =>
        {
            options.ClaimsProvider = context => new[]
            {
                new Claim(ClaimTypes.NameIdentifier, context.Request.Query["username"])
            };
        });

0

যে কেউ এসপ নেট কোরতে এটি করার চেষ্টা করছে For আপনি দাবি ব্যবহার করতে পারেন।

public class CustomEmailProvider : IUserIdProvider
{
    public virtual string GetUserId(HubConnectionContext connection)
    {
        return connection.User?.FindFirst(ClaimTypes.Email)?.Value;
    }
}

যে কোনও শনাক্তকারী ব্যবহার করা যেতে পারে তবে এটি অবশ্যই অনন্য। উদাহরণস্বরূপ আপনি যদি কোনও নাম সনাক্তকারী ব্যবহার করেন তবে এর অর্থ হ'ল যদি প্রাপকের একই নামের একাধিক ব্যবহারকারী থাকে তবে বার্তাটি তাদের কাছেও পৌঁছে দেওয়া হবে। আমি ইমেলটি বেছে নিয়েছি কারণ এটি প্রতিটি ব্যবহারকারীর কাছেই অনন্য।

তারপরে সার্ভিসটি স্টার্টআপ ক্লাসে নিবন্ধ করুন।

services.AddSingleton<IUserIdProvider, CustomEmailProvider>();

পরবর্তী. ব্যবহারকারীদের নিবন্ধনের সময় দাবিগুলি যুক্ত করুন।

var result = await _userManager.CreateAsync(user, Model.Password);
if (result.Succeeded)
{
    await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Email, Model.Email));
}

নির্দিষ্ট ব্যবহারকারীর কাছে বার্তা প্রেরণ করা।

public class ChatHub : Hub
{
    public async Task SendMessage(string receiver, string message)
    {
        await Clients.User(receiver).SendAsync("ReceiveMessage", message);
    }
}

দ্রষ্টব্য: বার্তা প্রেরককে অবহিত করা হবে না যে বার্তাটি প্রেরণ করা হয়েছে। আপনি যদি প্রেরকের শেষে কোনও বিজ্ঞপ্তি চান। এই SendMessageপদ্ধতিতে পরিবর্তন করুন ।

public async Task SendMessage(string sender, string receiver, string message)
{
    await Clients.Users(sender, receiver).SendAsync("ReceiveMessage", message);
}

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

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