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

时间:2016-08-02 20:58:06

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

我在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)
}

我在上传之前使用UTF-8对string进行编码,因为我将传递£¬之类的unicode字符......

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

public List<CRUDOutput> CreateResource(Resource resourceinfo)

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

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

第一个问题:

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

第二个问题:

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

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

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

上一个问题:

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

1 个答案:

答案 0 :(得分:4)

首先:Http请求的解码在哪里/什么?

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

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

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

如果存在与HTTP请求中的MIME标头匹配的媒体类型格式化程序(以红色突出显示),则该媒体类型格式化程序将读取该消息。如model binding resources中所述,可以通过Application Start中的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()); 
}

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

您是否发送了任何可能产生影响的更高级别的字符,或尝试为标题设置除UTF8之外的其他字符集? W3Schools有一个很好的表"Differences Between Charsets"尝试使用它来测试你的字符集标题和结果解码值的差异。

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

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

我很确定,但是没有任何可靠的资源,UTF-8现在是编码/解码字符串的事实上的标准。我不记得上次我见过除UTF-8以外的任何东西了,除了我最后一次用C编程。

但是,在.NET中,您可以使用WebClient.Encoding property检查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检查生成的标题。

P.S。我觉得有义务提到乔尔的great post on this topic