GET 和 POST 的 Asp.Net 文化不同

Posted

技术标签:

【中文标题】GET 和 POST 的 Asp.Net 文化不同【英文标题】:Asp.Net cultures differ for GET and POST 【发布时间】:2020-01-14 04:46:17 【问题描述】:

我将我的 Asp.Net Core 应用程序的文化设置为德语,如下所示:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)

    var supportedCultures = new[]  new CultureInfo("de-DE") ;

    app.UseRequestLocalization(new RequestLocalizationOptions
    
        DefaultRequestCulture = new RequestCulture("de-DE"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    );

    ...

当我使用 Postman 发送一个值时,这可以完美运行,并且所有内容都被正确解析。例如,如果我发送一个像 0,76 这样的值,它会被完美地解析为 0.76。 但是,当我向我的 API 端点发出 GET 请求时,它返回值 0.76。当然,这不是德国文化,并且在我的 API 中显示出一些不一致。向我的 API 发送和接收数据的开发人员应该始终使用相同的格式,这应该是德国文化。

这是默认行为还是应该是相同的格式?

编辑:

下面的屏幕截图显示,对于 GET 请求,小数点分隔符仍然是点而不是逗号。但是,当我通过 post 请求发送数据时,数据的格式正确,使用逗号作为小数分隔符而不是点。

【问题讨论】:

【参考方案1】:

这里:https://forums.asp.net/t/2119989.aspx?JSON+formatter+and+Localization+settings

它的 json 无效...

"netValue": 120,00,
"grossValueAdded": 147,60,

有效的json

"netValue": 120.00,
"grossValueAdded": 147.60,

您可以将所有小数转换为字符串,并使用字符串操作(不推荐)只是停留

"netValue": "120,00",
"grossValueAdded": "147,60",

【讨论】:

你说的完全有道理。因此,对于不同的请求,属性的格式不同是默认行为吗? POST 请求包含一个文件,因此我需要发送它的表单数据类型。但是,表单数据请求的所有数据都必须是字符串类型。我认为这就是 Asp.Net 尝试将文化应用于属性的原因。如果我将数据作为具有小数属性的 JSON 发送,Asp.Net 是否仍会应用这种文化?我的猜测是它不会。你知道我的意思吗? 我测试了它,确实,如果我在正文中发送 JSON 类型的请求并且属性是十进制类型,Asp.Net 将不会尝试应用文化。但是,如果我创建 String 类型的属性,它将自动应用文化,因此必须用逗号分隔。【参考方案2】:

我知道它为什么会这样。首先,这是我的模型的样子:

public class someDTO

    public int Id  get; set; 
    public int AuftragId  get; set; 
    public string Typ  get; set; 
    public decimal KundeBrutto  get; set; 
    public decimal KundeNetto  get; set; 
    public decimal KundeMwSt  get; set; 
    public decimal FahrerBrutto  get; set; 
    public decimal FahrerNetto  get; set; 
    public decimal FahrerMwSt  get; set; 
    public decimal MwStSatz  get; set;  = (decimal)0.19;
    public string MwStLand  get; set;  = "DE";
    public string FileName  get; set; 
    public string FileUrl  get; set; 

很明显,其中一些属性的类型为decimal。如果我从 GET 返回数据,Asp.Net 将返回一个带有数据的 JSON。正如 Seabizkit 所提到的,decimal 类型的属性总是用点分隔,因为它是内置类型。因此,文化将无关紧要。

然而,我想知道为什么我必须发送带有德国文化的数据。根据我的应用程序要求,我需要连同该数据一起发送一个文件,因此我们选择发出form-data 类型的请求。 form-data 的缺点是您发送的所有内容都是字符串类型,并且没有数据类型。当 Asp.Net 看到一个字符串时,它会尝试将该值从字符串映射到十进制。执行此操作时,它假定发送的字符串采用应用于服务器的区域性格式。例如。就我而言,我在服务器上将文化设置为德语,因此像“47,11”这样的值将正确映射到 47.11。

但是,如果您决定将 JSON 类型的数据发送到您的正文中,您当然可以将这些属性设为十进制类型,因此您可以将它们用点分隔发送。 因此,您将克服在不同文化中发送/接收数据的问题:

我希望这是有道理的!

【讨论】:

以上是关于GET 和 POST 的 Asp.Net 文化不同的主要内容,如果未能解决你的问题,请参考以下文章

asp.net页面的提交方式POST和GET有啥区别?

详解ASP.NET Core API 的Get和Post请求使用方式

asp.net页面的提交方式POST和GET有啥区别?

求助。asp.net 比较GET和POST传值方法

asp.net中get和post可以同时使用吗?

asp.net MVC api 如何同时支持POST和GET