首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP铁芯型变频器

ASP铁芯型变频器
EN

Stack Overflow用户
提问于 2019-08-12 11:30:07
回答 1查看 3.4K关注 0票数 1

我正在尝试配置ForwardedHeadersOptions,这是Microsoft.AspNetCore.HttpOverrides的一部分。我在我的appsettings.json中添加了选项

代码语言:javascript
复制
"ForwardedHeadersOptions": {
        "ForwardedHeaders": 5,
        "ForwardLimit": 1,
        "KnownProxies": [
            "111.111.111.111"
        ]
    },

前两个属性(ForwardedHeadersForwardLimit)映射正确,而KnownProxies没有映射。这是预期的,因为KnownProxies的类型是IList<IPAddress>。因此,为了映射此属性,我创建了类型转换器:

代码语言:javascript
复制
public class IPAddressTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        return base.ConvertFrom(context, culture, value);
    }
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        return destinationType == typeof(IPAddress) || base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (value != null && value is string)
        {
            return IPAddress.Parse(value.ToString());
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }
}

然后,我在IPAddressTypeConverter中注册了这样的Startup.cs

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    TypeDescriptor.AddAttributes(typeof(ForwardedHeadersOptions), new TypeConverterAttribute(typeof(IPAddressTypeConverter)));
    services.Configure<ForwardedHeadersOptions>(Configuration.GetSection(nameof(ForwardedHeadersOptions)));
 }

但是,当我启动app类型转换器方法时,从未被称为。你知道这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 14:27:49

当配置框架试图转换应用程序设置文件中的字符串时,它将从字符串进行转换。您的TypeConverter已注册以处理它将转换为的特定类型(IPAddress)。但它不需要测试这种类型。

CanConvertTo-方法用于序列化,即将注册的类型转换为另一种类型,如string。

因此,您的类型转换器应该如下所示:

代码语言:javascript
复制
public class IPAddressTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string) || sourceType == typeof(String))
        {
            return true;
        }
        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value != null && (value is string || value is String))
        {
            return IPAddress.Parse((string)value);
        }
        return base.ConvertFrom(context, culture, value);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(string))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string) && value is IPAddress)
        {
            return ((IPAddress)value).ToString();
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }

然后,在Startup.cs中,ConfigureServices(),包含几行用于清晰和调试断点机会的行:

代码语言:javascript
复制
        TypeDescriptor.AddAttributes(typeof(IPAddress), new TypeConverterAttribute(typeof(IPAddressTypeConverter)));

        var forwardedHeadersOptions = new ForwardedHeadersOptions();
        var forwardedHeadersSection = Configuration.GetSection("ForwardedHeadersOptions");
        forwardedHeadersSection.Bind(forwardedHeadersOptions);
        services.Configure<ForwardedHeadersOptions>(o =>
        {
            o.ForwardedHeaders = ForwardedHeaders.All;
            o.ForwardLimit = forwardedHeadersOptions.ForwardLimit;
            foreach(var knownProxy in forwardedHeadersOptions.KnownProxies)
            {
                o.KnownProxies.Add(knownProxy);
            }
            foreach(var knownNetwork in forwardedHeadersOptions.KnownNetworks)
            {
                o.KnownNetworks.Add(knownNetwork);
            }
        });

我尝试为KnownNetworks制作一个类似的类型转换器,但它没有成功,可能是因为输入(string / int)。因此,我最终创建了一个单独的IPNetworkSettingClass,其中前缀字段是一个字符串,而不是IPAdress类的一个对象。然后,我可以通过以下方式从应用程序中获取网络:

代码语言:javascript
复制
 var knownNetworks = Configuration.GetSection("ForwardedHeadersOptions").GetSection("KnownNetworks").Get<List<IPNetworkSetting>>();

最后,我以编程方式在绑定的ForwardedHeadersOptions-实例中设置KnownNetworks。

希望这能有所帮助

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57460367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档