You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET Core 2.0 Web API如何忽略XML请求中的命名空间前缀

解决.NET Core 2.0 Web API解析带命名空间前缀XML请求时参数为null的问题

嘿,我来帮你搞定这个XML命名空间的问题!你遇到的情况是因为修改后的XML请求带了命名空间前缀,但你的实体类没有正确配置对应的XML序列化特性,导致解析失败,参数一直为null。下面是具体的解决步骤:

第一步:确保XML请求的合法性

首先检查你的XML请求,每个前缀都必须有对应的命名空间声明——你给出的XML里v:Product没有对应的命名空间,这会直接导致解析错误。正确的XML应该补充完整命名空间声明,比如:

<?xml version="1.0"?>
<x:Katawan xmlns:x="http://www.w3.org/1999/xhtml" xmlns:v="http://your-product-namespace.com">
    <v:Product>
        <ProductId>string</ProductId>
        <ProductDescription>string</ProductDescription>
    </v:Product>
</x:Katawan>

(注意:请把http://your-product-namespace.com替换成你实际使用的产品命名空间)

第二步:修改实体类的XML序列化特性

XML序列化器只关心元素的实际命名空间值,不关心前缀(x、v这些只是别名),所以你需要把实体类的XmlRootXmlElement特性的Namespace属性设置为对应元素的命名空间:

修改Body类

[XmlRoot(ElementName = "Katawan", Namespace = "http://www.w3.org/1999/xhtml")]
public class Body
{
    // 这里的Namespace要和XML中v:Product对应的命名空间完全一致
    [XmlElement(ElementName = "Product", Namespace = "http://your-product-namespace.com")]
    public ProductRequest ProductRequest { get; set; }
}

ProductRequest类保持不变

因为ProductIdProductDescription没有前缀也未指定命名空间,所以不需要修改:

public class ProductRequest
{
    public string ProductId { get; set; }
    public string ProductDescription { get; set; }
}

第三步:确保项目配置了XML序列化支持

在.NET Core 2.0中,默认仅启用JSON格式化,你需要在Startup.csConfigureServices方法中添加XML序列化支持:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddXmlSerializerFormatters(); // 启用XML请求/响应的序列化处理
}

如果需要更灵活的配置(比如忽略未知元素、临时忽略命名空间),可以自定义XmlSerializerSettings

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        var xmlSettings = new XmlSerializerSettings
        {
            IgnoreUnknownElements = true,
            // 如果需求允许忽略命名空间,可以开启这个,但不推荐规范场景使用
            // NamespaceHandling = NamespaceHandling.Ignore
        };
        
        options.OutputFormatters.Add(new XmlSerializerOutputFormatter(xmlSettings));
        options.InputFormatters.Add(new XmlSerializerInputFormatter(options, xmlSettings));
    });
}

完成这些修改后,重新测试你的API请求,应该就能正确解析XML参数,不再出现null的情况了。

内容的提问来源于stack exchange,提问作者Chris

火山引擎 最新活动