加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 06:55:18 所属栏目:asp.Net 来源:网络整理
导读:我在IIS8下部署了两个ASP.NET MVC Web应用程序(让我称之为发送方和接收方Web应用程序).我从发送方内部的操作方法调用接收方Web应用程序中的操作方法. 现在在发件人中,我有以下操作方法,将字符串上传到接收器上的外部操作方法: using (WebClient wc = new We
我在IIS8下部署了两个ASP.NET MVC Web应用程序(让我称之为发送方和接收方Web应用程序).我从发送方内部的操作方法调用接收方Web应用程序中的操作方法.

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

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编码字符串,因为我将传递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()会使用默认编码吗?

解决方法

第一: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()); 
}

第二:为什么不指定charset似乎有效?

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

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

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

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

但是,在.NET中,您可以使用WebClient.Encoding property检查WebClient的编码.它说:用于编码字符串的编码.此属性的默认值是Default返回的编码. ‘默认’的位置是:Encoding.Default.如果您调试程序并发现它是UTF-8,我绝对不会感到惊讶.

一个好主意是使用此设置,并使用Fiddler检查生成的标题.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读