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

joh*_* Gu 5 .net asp.net asp.net-mvc webclient asp.net-mvc-4

我在IIS8下部署了两个ASP.NET MVC Web应用程序(让我称之为发送方和接收方Web应用程序).我从发送方内部的操作方法调用接收方Web应用程序中的操作方法.

现在在发件人中,我有以下操作方法,将上传string到接收器上的外部操作方法:

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)
}
Run Code Online (Sandbox Code Playgroud)

我编码string使用UTF-8在上传之前,因为我将传递Unicode字符,如£,¬等...

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

public List<CRUDOutput> CreateResource(Resource resourceinfo)
Run Code Online (Sandbox Code Playgroud)

一开始我认为我的方法不会很好.因为我正在wc.Encoding = System.Text.Encoding.UTF8;从发送器向接收器动作方法发送编码数据(使用),并且我没有对接收器动作方法进行任何类型的解码.

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

第一个问题:

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

第二个问题:

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

 wc.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
Run Code Online (Sandbox Code Playgroud)

然而,似乎这对我的情况没有任何影响.当我删除上面的代码行时,没有任何变化.任何人都可以告诉我,如果定义内容类型标题会对我的情况有任何影响吗?

最后一个问题:

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

Sam*_*Sam 4

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

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

Web API 管道海报很好地描述了这种情况何时发生以及发生了什么。

以下是其中的摘录,显示了我认为您正在寻找的区域:模型绑定图

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

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

public static void ConfigureApis(HttpConfiguration config)
{
    config.Formatters.Add(new ProductCsvFormatter()); 
}
Run Code Online (Sandbox Code Playgroud)

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

您是否发送了任何会产生影响的高级字符,或者尝试为标头设置除 UTF8 之外的其他字符集?W3Schools 有一个很好的表“字符集之间的差异”,尝试使用它来测试字符集标头和生成的解码值的差异。

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

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

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

但是,在 .NET 中,您可以使用WebClient.Encoding 属性检查 WebClient 的编码。它在那里说:A Encoding that is used to encode strings. The default value of this property is the encoding returned by Default.“默认”是:Encoding.Default。如果您调试程序并发现它是 UTF-8,我绝对不会感到惊讶。

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

PS 我觉得有必要提及 Joel关于这个主题的精彩帖子