国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ASP.NET Core SignalR 系列(四)- 中心篩選器

這篇具有很好參考價(jià)值的文章主要介紹了ASP.NET Core SignalR 系列(四)- 中心篩選器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本章將和大家分享 ASP.NET Core SignalR 中的中心篩選器。

本文大部分內(nèi)容摘自微軟官網(wǎng):https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hub-filters?view=aspnetcore-7.0

廢話不多說(shuō),下面我們直接進(jìn)入本章主題。

中心篩選器:

  • 在 ASP.NET Core 5.0 或更高版本中可用。
  • 允許在客戶端調(diào)用中心方法之前和之后運(yùn)行邏輯。

1、創(chuàng)建中心篩選器

通過(guò)聲明從?IHubFilter?繼承的類來(lái)創(chuàng)建篩選器,并添加?InvokeMethodAsync?方法。 還可以選擇實(shí)現(xiàn)?OnConnectedAsync?和?OnDisconnectedAsync,以分別包裝?OnConnectedAsync?和?OnDisconnectedAsync?中心方法。

using Microsoft.AspNetCore.SignalR;

namespace SignalRChat.HubFilter
{
    public class CustomFilter : IHubFilter
    {
        public async ValueTask<object> InvokeMethodAsync(HubInvocationContext invocationContext, Func<HubInvocationContext, ValueTask<object>> next)
        {
            System.Diagnostics.Debug.WriteLine($"Calling hub method '{invocationContext.HubMethodName}'");
            try
            {
                var result = await next(invocationContext); //調(diào)用下一個(gè)篩選器,最終篩選器將調(diào)用中心方法
                System.Diagnostics.Debug.WriteLine($"Called hub method '{invocationContext.HubMethodName}'");
                return result;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception calling '{invocationContext.HubMethodName}': {ex}");
                throw;
            }
        }

        // Optional method
        public Task OnConnectedAsync(HubLifetimeContext context, Func<HubLifetimeContext, Task> next)
        {
            return next(context);
        }

        // Optional method
        public Task OnDisconnectedAsync(
            HubLifetimeContext context, Exception exception, Func<HubLifetimeContext, Exception, Task> next)
        {
            return next(context, exception);
        }
    }
}

篩選器與中間件非常相似。?next?方法調(diào)用下一個(gè)篩選器。 最終篩選器將調(diào)用中心方法。 篩選器還可以存儲(chǔ)等待?next?的結(jié)果,并在調(diào)用中心方法之后、從?next?返回結(jié)果之前運(yùn)行邏輯。

若要跳過(guò)篩選器中的中心方法調(diào)用,請(qǐng)引發(fā)?HubException?類型的異常,而不是調(diào)用?next。 如果客戶端需要結(jié)果,則會(huì)收到錯(cuò)誤。

2、配置中心篩選器

中心篩選器可以全局應(yīng)用或按中心類型應(yīng)用。 篩選器的添加順序就是其運(yùn)行順序。 全局中心篩選器在本地中心篩選器之前運(yùn)行。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(options =>
    {
        // Global filters will run first
        options.AddFilter<CustomFilter>();
    }).AddHubOptions<ChatHub>(options =>
    {
        // Local filters will run second
        options.AddFilter<CustomFilter2>();
    });
}

可以通過(guò)以下方式之一添加中心篩選器:

1)按具體類型添加篩選器:

hubOptions.AddFilter<TFilter>();

將通過(guò)依賴項(xiàng)注入 (DI) 或激活的類型來(lái)解析。

2)按運(yùn)行時(shí)類型添加篩選器:

hubOptions.AddFilter(typeof(TFilter));

將通過(guò) DI 或激活的類型來(lái)解析。

3)按實(shí)例添加篩選器:

hubOptions.AddFilter(new MyFilter());

將像單一實(shí)例一樣使用此實(shí)例。 所有中心方法調(diào)用都將使用相同的實(shí)例。

系統(tǒng)根據(jù)中心調(diào)用來(lái)創(chuàng)建和釋放中心篩選器。 如果要在篩選器中存儲(chǔ)全局狀態(tài),或者不存儲(chǔ)狀態(tài),請(qǐng)將中心篩選器類型作為單一實(shí)例添加到 DI,以獲得更好的性能。 或者,如果可以,將篩選器添加為實(shí)例。

3、使用中心篩選器

編寫(xiě)篩選器邏輯時(shí),請(qǐng)嘗試通過(guò)在中心方法上使用特性而不是檢查中心方法名稱,使其成為泛型邏輯。

以某個(gè)篩選器為例,該篩選器將檢查中心方法參數(shù)中是否有被禁短語(yǔ),并將找到的任何短語(yǔ)替換為?***。 對(duì)于此示例,假設(shè)定義了?LanguageFilterAttribute?特性類。 該類有一個(gè)名為?FilterArgument?的屬性,可以在使用該屬性時(shí)對(duì)其進(jìn)行設(shè)置。

1)將該特性標(biāo)簽打在需要清理字符串參數(shù)的中心方法上:

public class ChatHub
{
    [LanguageFilter(filterArgument = 0)]
    public async Task SendMessage(string message, string username)
    {
        await Clients.All.SendAsync("SendMessage", $"{username} says: {message}");
    }
}

2)定義一個(gè)中心篩選器,以檢查該特性并將中心方法參數(shù)中的被禁短語(yǔ)替換為 ***:

public class LanguageFilter : IHubFilter
{
    // populated from a file or inline
    private List<string> bannedPhrases = new List<string> { "async void", ".Result" };

    public async ValueTask<object> InvokeMethodAsync(HubInvocationContext invocationContext, 
        Func<HubInvocationContext, ValueTask<object>> next)
    {
        var languageFilter = (LanguageFilterAttribute)Attribute.GetCustomAttribute(
            invocationContext.HubMethod, typeof(LanguageFilterAttribute));
        if (languageFilter != null &&
            invocationContext.HubMethodArguments.Count > languageFilter.FilterArgument &&
            invocationContext.HubMethodArguments[languageFilter.FilterArgument] is string str)
        {
            foreach (var bannedPhrase in bannedPhrases)
            {
                str = str.Replace(bannedPhrase, "***");
            }

            var arguments = invocationContext.HubMethodArguments.ToArray();
            arguments[languageFilter.FilterArgument] = str;
            invocationContext = new HubInvocationContext(invocationContext.Context,
                invocationContext.ServiceProvider,
                invocationContext.Hub,
                invocationContext.HubMethod,
                arguments);
        }

        return await next(invocationContext);
    }
}

3)在 Startup.ConfigureServices 方法中注冊(cè)中心篩選器。 為了避免每次調(diào)用都重新初始化被禁短語(yǔ)列表,中心篩選器將注冊(cè)為單一實(shí)例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.AddFilter<LanguageFilter>();
    });

    services.AddSingleton<LanguageFilter>();
}

4、HubInvocationContext 對(duì)象

HubInvocationContext?包含當(dāng)前中心方法調(diào)用的信息。

屬性 說(shuō)明 類型
?Context ?HubCallerContext?包含有關(guān)連接的信息。 ?HubCallerContext
?Hub ?用于此中心方法調(diào)用的中心實(shí)例。 ?Hub
?HubMethodName ?正在調(diào)用的中心方法的名稱。 ?string
?HubMethodArguments ?傳遞給中心方法的參數(shù)列表。 ?IReadOnlyList<string>
?ServiceProvider ?用于此中心方法調(diào)用的已限定范圍的服務(wù)提供程序。 ?IServiceProvider
?HubMethod ?中心方法信息。 ?MethodInfo

5、HubLifetimeContext 對(duì)象

HubLifetimeContext?包含?OnConnectedAsync?和?OnDisconnectedAsync?中心方法的信息。

屬性 說(shuō)明 類型
Context HubCallerContext?包含有關(guān)連接的信息。 HubCallerContext
Hub 用于此中心方法調(diào)用的中心實(shí)例。 Hub
ServiceProvider 用于此中心方法調(diào)用的已限定范圍的服務(wù)提供程序。 IServiceProvider

6、授權(quán)和篩選器

中心方法上的 Authorize 屬性在中心篩選器之前運(yùn)行。

至此本文就全部介紹完了,想要了解更多內(nèi)容可參考微軟官網(wǎng)。

?

Demo源碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-570091.html

鏈接:https://pan.baidu.com/s/1la_AnXNqsXWRG0bslh5dFg 
提取碼:54kz

到了這里,關(guān)于ASP.NET Core SignalR 系列(四)- 中心篩選器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ASP.NET Core SignalR 系列(三)- JavaScript 客戶端

    ASP.NET Core SignalR 系列(三)- JavaScript 客戶端

    本章將和大家分享 ASP.NET Core SignalR 中的 JavaScript 客戶端。ASP.NET Core SignalR JavaScript 客戶端庫(kù)使開(kāi)發(fā)人員能夠調(diào)用服務(wù)器端SignalR中心代碼。 本文大部分內(nèi)容摘自微軟官網(wǎng):https://learn.microsoft.com/zh-cn/aspnet/core/signalr/javascript-client?view=aspnetcore-7.0tabs=visual-studio 廢話不多說(shuō),下面我們

    2024年02月15日
    瀏覽(99)
  • 【EasyExcel】導(dǎo)出excel凍結(jié)表頭和凍結(jié)指定列并支持篩選器

    【EasyExcel】導(dǎo)出excel凍結(jié)表頭和凍結(jié)指定列并支持篩選器

    需求背景: ? ? ? ? 導(dǎo)出excel的同時(shí)凍結(jié)表頭和前兩列基礎(chǔ)信息,方便導(dǎo)出后用戶查看信息。 一、技術(shù)選型: ? ? ? ? easyExcel的自定義寫(xiě)策略處理:SheetWriteHandler 二、方案設(shè)計(jì):(基于實(shí)現(xiàn) SheetWriteHandler 接口) ? ? ? ? 1、重寫(xiě)afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder,

    2024年01月24日
    瀏覽(30)
  • ASP.NET Core SignalR 入門(mén)

    ASP.NET Core SignalR 入門(mén)

    本章將和大家分享使用 SignalR 生成實(shí)時(shí)應(yīng)用的基礎(chǔ)知識(shí)。通過(guò)本文您將學(xué)習(xí)如何:使用ASP.NET Core SignalR + MVC + Vue 2.x + require 最終創(chuàng)建一個(gè)正常運(yùn)行的簡(jiǎn)易聊天應(yīng)用。 廢話不多說(shuō),我們直接來(lái)看一個(gè)Demo,Demo的目錄結(jié)構(gòu)如下所示: 本Demo的Web項(xiàng)目為ASP.NET Core Web 應(yīng)用程序( 目標(biāo)框

    2024年02月11日
    瀏覽(25)
  • 什么是 ASP.NET Core SignalR?

    所有連接了 Internet 的應(yīng)用程序都由服務(wù)器和客戶端組成。 客戶端依賴于服務(wù)器獲取數(shù)據(jù),而它們獲取數(shù)據(jù)的主要機(jī)制是通過(guò)發(fā)出超文本傳輸協(xié)議 (HTTP) 請(qǐng)求來(lái)進(jìn)行的。 某些客戶端應(yīng)用程序需要經(jīng)常更改的數(shù)據(jù)。 ASP.NET Core SignalR 提供了一個(gè) API,用于創(chuàng)建服務(wù)器到客戶端遠(yuǎn)程過(guò)

    2024年02月15日
    瀏覽(92)
  • ASP.NET Core實(shí)時(shí)庫(kù)SignalR簡(jiǎn)單應(yīng)用

    ASP.NET Core實(shí)時(shí)庫(kù)SignalR簡(jiǎn)單應(yīng)用

    SignalR 是用于構(gòu)建需要實(shí)時(shí)用戶交互或?qū)崟r(shí)數(shù)據(jù)更新的Web 應(yīng)用程序的一個(gè)開(kāi)放源代碼.NET 庫(kù)。不僅僅用在Web應(yīng)用中,后面會(huì)講到它的應(yīng)用范圍。它簡(jiǎn)化了簡(jiǎn)化了構(gòu)建實(shí)時(shí)應(yīng)用程序的過(guò)程,包括 ASP.NET Server 庫(kù)和 JavaScript Client 庫(kù),以便管理Client與Server連接并將內(nèi)容更新推送給Cl

    2024年02月11日
    瀏覽(23)
  • 【ASP.NET Core】使用SignalR推送服務(wù)器日志

    【ASP.NET Core】使用SignalR推送服務(wù)器日志

    一個(gè)多月前接手了一個(gè)產(chǎn)線機(jī)器人項(xiàng)目,上位機(jī)以讀寫(xiě)寄存器的方式控制機(jī)器人,服務(wù)器就是用 ASP.NET Core 寫(xiě)的 Web API。由于前一位開(kāi)發(fā)者寫(xiě)的代碼質(zhì)量問(wèn)題,導(dǎo)致上位機(jī)需要16秒才能啟動(dòng)。經(jīng)過(guò)我近一個(gè)月的改造,除了保留業(yè)務(wù)邏輯代碼,其他的基本重寫(xiě)。如今上位機(jī)的啟動(dòng)

    2024年02月03日
    瀏覽(23)
  • ASP.NET Core+Vue3 實(shí)現(xiàn)SignalR通訊

    ASP.NET Core+Vue3 實(shí)現(xiàn)SignalR通訊

    從ASP.NET Core 3.0版本開(kāi)始,SignalR的Hub已經(jīng)集成到了ASP.NET Core框架中。因此,在更高版本的ASP.NET Core中,不再需要單獨(dú)引用Microsoft.AspNetCore.SignalR包來(lái)使用Hub。 在項(xiàng)目創(chuàng)建一個(gè)類繼承Hub, 首先是寫(xiě)一個(gè)CreateConnection方法 ConnectionId是SignalR中標(biāo)識(shí)的客戶端連接的唯一標(biāo)識(shí)符, 將userId和

    2024年02月06日
    瀏覽(24)
  • Web SSH 的原理與在 ASP.NET Core SignalR 中的實(shí)現(xiàn)

    Web SSH 的原理與在 ASP.NET Core SignalR 中的實(shí)現(xiàn)

    有個(gè)項(xiàng)目,需要在前端有個(gè)管理終端可以 SSH 到主控機(jī)的終端,如果不考慮用戶使用 vim 等需要在控制臺(tái)內(nèi)現(xiàn)實(shí)界面的軟件的話,其實(shí)使用 Process 類型去啟動(dòng)相應(yīng)程序就夠了。而這次的需求則需要考慮用戶會(huì)做相關(guān)設(shè)置。 這里用到的原理是偽終端。偽終端(pseudo terminal)是現(xiàn)

    2024年02月07日
    瀏覽(20)
  • 微信小程序如何使用原生Websocket與Asp.Net Core SignalR 通信

    微信小程序如何使用原生Websocket與Asp.Net Core SignalR 通信

    如題,這可能算是.net 做小程序的服務(wù)端時(shí),繞不開(kāi)的一個(gè)問(wèn)題,老生常談了。同樣的問(wèn)題,我記得我2018/19年的一個(gè)項(xiàng)目的解決方案是: 修改官方的SignalR.js的客戶端 :把里面用到瀏覽器的Websocket改成微信小程序的官方api的。目前網(wǎng)上也有不少這樣的方案,已經(jīng)改好開(kāi)源了;

    2024年02月08日
    瀏覽(129)
  • 微信小程序如何使用原生Websocket api與Asp.Net Core SignalR 通信

    微信小程序如何使用原生Websocket api與Asp.Net Core SignalR 通信

    如題,這可能算是.net 做小程序的服務(wù)端時(shí),繞不開(kāi)的一個(gè)問(wèn)題,老生常談了。同樣的問(wèn)題,我記得我2018/19年的一個(gè)項(xiàng)目的解決方案是: 修改官方的SignalR.js的客戶端 :把里面用到瀏覽器的Websocket改成微信小程序的官方api的。目前網(wǎng)上也有不少這樣的方案,已經(jīng)改好開(kāi)源了;

    2024年02月09日
    瀏覽(39)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包