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 文化不同的主要内容,如果未能解决你的问题,请参考以下文章