【问题标题】:How/Where asp.net mvc handle decoding and of the action methods parametersasp.net mvc 如何/在哪里处理解码和操作方法参数
【发布时间】:2016-12-08 09:23:19
【问题描述】:

我在 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 字符...

在receiver web应用上,接收action方法如下:

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() 会使用默认编码吗?

【问题讨论】:

  • 通常不需要对数据进行编码。看起来您向 CreateResource 操作方法发布了一个字符串,但它需要一个模型。什么是资源?
  • @Win 但如果我不使用 UTF8 进行编码,那么我将无法传递非 ASCII 字符,例如 £ 或 ¬,这就是为什么我选择对数据进行编码以便能够传递非 ASCII 字符...否则,如果我从发件人传递诸如 £ 之类的字符,它将被接收为?在接收器操作方法中......对于资源,它是我在发送者和接收者Web应用程序上创建的模型类..除此之外,我正在从发送者发送一个代表资源模型类的json字符串(json字符串正在发送的是模型类的序列化表示)...

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


【解决方案1】:

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

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

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

这里有一段摘录,显示我认为您正在寻找的区域:

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

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

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

第二:为什么指定charset好像没有效果?

您是否发送了任何会产生影响的更高级别的字符,或者尝试为标题设置除 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 检查生成的标头。

附:我觉得有义务提及 Joel 的great post on this topic

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多