asp.net - asp.net mvc 如何/在哪里处理解码和操作方法参数

标签 asp.net .net asp.net-mvc asp.net-mvc-4 webclient

我有两个部署在 IIS8 下的 ASP.NET MVC Web 应用程序(让我将它们称为发送者和接收者 Web 应用程序)。我从发送者内部的操作方法调用接收者 Web 应用程序内部的操作方法。

现在在发送方内部,我有以下操作方法,它将上传一个字符串到接收方的外部操作方法:

using (WebClient wc = new WebClient())                
{
    var data = JsonConvert.SerializeObject(resource);      
    string url = "https://receiver/CreateResource?AUTHTOKEN=" + pmtoken;
    Uri uri = new Uri(url);
    wc.Encoding = System.Text.Encoding.UTF8;
    wc.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
    wc.Headers.Add("Authorization", token);
    output = wc.UploadString(uri, data)
}

在上传之前,我使用 UTF-8 对 string 进行编码,因为我将传递 unicode 字符,例如 £Ø 、等等...

在接收方Web应用程序上,接收操作方法如下:

public List<CRUDOutput> CreateResource(Resource resourceinfo)

一开始我认为我的方法效果不佳。由于我正在从发送方向接收方操作方法发送编码数据(使用 wc.Encoding = System.Text.Encoding.UTF8;),并且我没有在接收方上进行任何类型的解码 Action 方法。

但是,在接收操作方法上,resourceinfo 似乎收到了正确的解码值。所以看起来 ASP.NET MVC 会在某个地方自动处理解码。

第一个问题:

谁能告诉我 ASP.NET MVC 如何处理接收操作方法内的解码?

第二个问题:

在我的 WebClient() 方法中,我定义以下内容来指定内容类型 header :

 wc.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");

然而,这似乎对我的情况没有任何影响。当我删除上面的代码行时,没有任何变化。谁能告诉我定义内容类型 header 对我的情况是否有任何影响?

最后一个问题:

如果我没有使用 wc.Encoding = System.Text.Encoding.UTF8; 显式定义 UTF-8 编码,WebClient() 会使用默认编码吗?

最佳答案

第一:Http 请求的解码在哪里/什么?

在 ASP.NET 中,获取 HTTP 请求并将其转换为 C# 的过程 POCO称为 Model Binding

web api pipeline poster很好地描述了这种情况何时发生以及发生了什么。

以下摘录显示了我认为您正在寻找的区域:Model Binding Diagram

如果存在与 HTTP 请求中的 MIME header 匹配的媒体类型格式化程序(上面以红色突出显示),则该媒体类型格式化程序将读取该消息。如 model binding resources 中所述,媒体类型格式化程序可以通过 HttpConfiguration.Formatters 配置应用程序启动时的属性,通常位于 Startup.cs 或 Global.Asax.cs 中。我敢打赌,如果您调试并检查 Config.Formatters,您会发现一个配置为 UTF-8 的 JsonFormatter。

The tutorial “将媒体格式化程序添加到 Web API 管道”部分中有一个用于设置自定义格式化程序的代码片段。

public static void ConfigureApis(HttpConfiguration config)
{
    config.Formatters.Add(new ProductCsvFormatter()); 
}

第二:为什么指定字符集似乎没有效果?

您是否发送了任何会产生影响的高级字符,或者尝试为 header 设置除 UTF8 之外的其他字符集? W3Schools 有一张不错的 table "Differences Between Charsets"尝试使用它来测试字符集 header 和生成的解码值的差异。

我认为这个问题的真正答案是你的第三个问题的答案......

第三:默认字符集是什么?

我很确定,但没有任何可靠的资源,UTF-8 是当今编码/解码字符串的事实上的标准。除了上次用 C 编程之外,我真的记不起上次看到 UTF-8 以外的任何内容是什么时候了。

但是,在 .NET 中,您可以使用 WebClient.Encoding property 检查 WebClient 的编码。 。它在那里说:用于对字符串进行编码的编码。此属性的默认值是 Default 返回的编码。 其中“Default”为:Encoding.Default 。如果您调试程序并发现它是 UTF-8,我绝对不会感到惊讶。

一个好主意是尝试此设置,并使用 Fiddler检查生成的 header 。

附注我觉得有义务提及乔尔的great post on this topic .

关于asp.net - asp.net mvc 如何/在哪里处理解码和操作方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730312/

相关文章:

c# - 在 ASP.NET MVC 中将多个参数传递给 Controller ​​;此外,在 LINQ-to-SQL 中生成即时查询

c# - 将 Angular 与现有的 Asp.Net 网站一起使用

asp.net - 如何知道服务器中是否安装了asp.net 3.5 sp1和asp.net mvc?

.net - 绑定(bind)到 DataTemplate 中的父 DataContext

c# - XtraScheduler 双击

.net - 将 HTML 渲染为 TIFF

asp.net-mvc - Accord.NET 比较两个图像以确定相似性

c# - 在 C# 中解析 JSON 的最有效方法

c# - 在特定列中写入 Serilog ASP.NET MVC C#

c# - System.Random 的深度克隆