簡體   English   中英

SignalR .NET Core camelCase JSON 合同解析器

[英]SignalR .NET Core camelCase JSON Contract Resolver

使用 .NET Core RC2。 讓 SignalR 正常工作,但試圖讓它以 JSON 格式返回駝峰大小寫屬性。

對於我正在使用的 API...

services.AddMvc().AddJsonOptions(o => {
    o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});

也許 SignalR 還沒有到位(畢竟,它甚至不應該工作......),但想知道是否有人已經弄清楚了嗎? 我嘗試了一些事情,例如...

services.AddTransient<IContractResolver, CamelCasePropertyNamesContractResolver>();

……但是不行。

有人讓這個工作了嗎?

讓我引用GitHub 上anurse 的回答:

由於協議是可插入的,因此選項被移到了不同​​的位置,因為您可以選擇根本不使用 JSON。 現在您在 ConfigureServices 的 .AddJsonProtocol 擴展方法中設置它們,如下所示:

services.AddSignalR()
.AddJsonProtocol(options => {
    // Edit or replace 'options.PayloadSerializerSettings' here!
});

基於 SignalR Core 存儲庫中的這個問題,目前還沒有本地方法可以執行此操作,但是您可以創建自定義合同解析器,如有關舊 SignalR 問題的此評論中所述

由於該線程適用於 SignalR 2.2.0,讓我們使其適用於 SignalR Core。

using System;
using System.Reflection;
using Microsoft.AspNetCore.SignalR.Infrastructure;
using Newtonsoft.Json.Serialization;

    public class SignalRContractResolver : IContractResolver
    {
        private readonly Assembly _assembly;
        private readonly IContractResolver _camelCaseContractResolver;
        private readonly IContractResolver _defaultContractSerializer;

        public SignalRContractResolver()
        {
            _defaultContractSerializer = new DefaultContractResolver();
            _camelCaseContractResolver = new CamelCasePropertyNamesContractResolver();
            _assembly = typeof(Connection).GetTypeInfo().Assembly;
        }


        public JsonContract ResolveContract(Type type)
        {
            if (type.GetTypeInfo().Assembly.Equals(_assembly))
                return _defaultContractSerializer.ResolveContract(type);

            return _camelCaseContractResolver.ResolveContract(type);
        }

    }

這里發生的情況是您不能對 SignalR 內部使用駝峰式合同解析器,因為它會中斷與客戶端的通信。

因此,每次我們在ResolveContract方法中解析合約時,我們都必須檢查當前解析的類型的程序集,並檢查它是否是 SignalR 內部的。 如果沒有,那么我們可以使用駱駝案例解決合同。

此時,我們需要在框架中注冊這個合約解析器。

public void ConfigureServices(IServiceCollection services)
    {
        var settings = new JsonSerializerSettings();
        settings.ContractResolver = new SignalRContractResolver();

        var serializer = JsonSerializer.Create(settings);

        services.Add(new ServiceDescriptor(typeof(JsonSerializer), 
                                           provider => serializer,
                                           ServiceLifetime.Transient));

        // register other services like SignalR, MVC and custom services
     }

祝你好運!

從 signalR 核心 (1.0.0-alpha1-final) 的第一個最終 alpha 版本開始,您可以像下面的代碼片段一樣本地獲得駝峰案例:

services.AddSignalR(option =>
{
    option.JsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});

事實上,你也可以使用任何自定義的解析器來代替CamelCasePropertyNamesContractResolver

在 SignalR 3.0 中,您可以使用以下語句執行此操作,如Microsoft Docs 中所述

services.AddSignalR()
  .AddNewtonsoftJsonProtocol(
    options =>
      options.PayloadSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()
  );

使用 ASP.NET Core 3.0 和 SignalR 3.0,這是有效的:

services.AddSignalR()
   .AddJsonProtocol(options =>
   {
       options.PayloadSerializerOptions.PropertyNamingPolicy = null; 
   });

在 .NET Core 3.0 中,使用 System.Text.Json

 services.AddSignalR().AddJsonProtocol(options =>
        {
            options.PayloadSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM