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()
使用默认编码?
在 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关于这个主题的精彩帖子。
归档时间: |
|
查看次数: |
585 次 |
最近记录: |