我在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()
会使用默认编码吗?
答案 0 :(得分:4)
在ASP.NET中,获取HTTP请求并将其转换为C#POCO的过程称为Model Binding。
web api pipeline poster可以很好地描述这种情况何时发生,以及它是什么。
如果存在与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。