最近在做一个工具,里面有一个发起http请求的操作,虽然工具不是用.NET写的,但是测试用服务器软件是.NET写的。在这里选择了ASP.NET MVC和Web API 2。

首先预定义Student与Human类,ASP.NET MVC定义了一个限定HttpPost的方法,要求传递一个Student对象。ASP.NET Web API 2 定义了一个限定HttpPost的方法,要求也是传递一个Student对象。

public class Human
{
public string Name { get; set; }
public Int32 Age { get; set; }
} public class Student : Human
{
public String[] School { get; set; }
}
[System.Web.Mvc.HttpPost]
public dynamic Req(Student student)
{
if (student != null)
{
return student;
}
return new Student { Name = "Joe", Age = 23, School = new string[] { "Oracle" } };
} [HttpPost]
public Student Req(Student student)
{
if (student != null)
{
return student;
}
return new Student { Name = "Joe", Age = 23, School = new string[] { "Oracle" } };
}

在工具里向这两个地址发起Post请求,头部设置Content-Type为application/json,正文为Student对象的JSON序列化。

然后在跟踪的时候发现,Web API 2的Student对象一直为Null,也就是Web API 2没有拿到请求正文的对象。然而MVC是拿到了的。这个时候陷入了江局,MVC能拿到代表正文内容是发出去了的,序列化内容也是没有问题的,但是Web API 2拿不到就说明请求还存在问题。

在StackOverflow和一些乱七八糟的网站上看了半天,似乎总是在围绕[FromBody],事实上不论加不加我这都是Null。一直检索似乎也不是个事,索性直接对比ASP.NET MVC与ASP.NET Web API 2的请求信息,结果发现一个问题:

发送给Web API 2的请求的Content-Length是0,但是MVC的则是实际长度。联想到在请求发起时的确没有设定Content-Length,估计是MVC自动标准化了请求的信息,而Web API 2严格遵循http标准,当Content-Length为0时便不再处理正文内容。

所以如果需要写代码对Web API 2发起请求,请不要忘记设置Content-Length,否则会忽略掉正文内容。

Web API 2 对于 Content-Length 要求严格的更多相关文章

  1. HttpClient读取ASP.NET Web API错误信息的简单方法

    在C#中,用HttpClient调用Web API并且通过Content.ReadAsStringAsync()读取响应内容时,如果出现500错误(InternalServerError),会得到一个 ...

  2. 【ASP.NET Web API教程】1.1 第一个ASP.NET Web API

    Your First ASP.NET Web API (C#)第一个ASP.NET Web API(C#) By Mike Wasson|January 21, 2012作者:Mike Wasson ...

  3. 使用 asp.net Web API 2的坑

    使用工具: Googl  浏览器+PostMan 插件 写了个  控制器 添加了个Action,结果呢?GET 方式请求没问题. POST一直,在服务器端获取不了参数...找了官方的文档 .各种雨里雾 ...

  4. 【ASP.NET Web API教程】6 格式化与模型绑定

    原文:[ASP.NET Web API教程]6 格式化与模型绑定 6 Formats and Model Binding 6 格式化与模型绑定 本文引自:http://www.asp.net/web- ...

  5. A simple Test Client built on top of ASP.NET Web API Help Page

    Step 1: Install the Test Client package Install the WebApiTestClient package from the NuGet Package ...

  6. Content Negotiation in ASP.NET Web API

    本文描述Web API实现内容协商(content negotiation). The HTTP specification (RFC 2616) defines content negotiatio ...

  7. Asp.Net Web API 2第十四课——Content Negotiation(内容协商)

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  8. 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能

    文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...

  9. 用JWT来保护我们的ASP.NET Core Web API

    在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...

  10. Web Api 与 Andriod 接口对接开发经验

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

随机推荐

  1. java常用设计模式五:建造者模式

    1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...

  2. ubuntu 出现device not managed,解决方法

    1. 编辑/etc/NetworkManager/NetworkManager.conf: sudo vi /etc/NetworkManager/NetworkManager.conf将其中的man ...

  3. 微信小程序与Vue js数据渲染对比

    //小程序 Page({ data: { items: [] }, onLoad: function(options) { this.setData({ items: [1,2,3] }) } }) ...

  4. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十一之铭文升级版

    铭文一级: 第8章 Spark Streaming进阶与案例实战 黑名单过滤 访问日志 ==> DStream20180808,zs20180808,ls20180808,ww ==> ( ...

  5. java基础-day28

    第05天 MySQL 今日内容介绍 u 数据库的概述 u MySQL和SQLyog的安装和使用 u SQL语句 第1章   数据库的概述 1.1  数据库的概述 1.1.1 概述 l  什么是数据库 ...

  6. Java包、权限访问修饰符、封装性

    包 概念: 物理上是文件夹:逻辑上是有逻辑关系的类的集合 作用: 避免类重名:控制访问权限 命名规范: 在包名中,可以使用.号来区分包的级别:包名一般情况下是小写 第一级 指该项目的类型,如com,o ...

  7. 9.DataGrid数据表格

    后台获取数据并将其转换为json数组格式: 前台获取数据并显示在数据表格中:

  8. Codeforces Round #265 (Div. 2) E. Substitutes in Number

    http://codeforces.com/contest/465/problem/E 给定一个字符串,以及n个变换操作,将一个数字变成一个字符串,可能为空串,然后最后将字符串当成一个数,取模1e9+ ...

  9. Poj2296

    题意:给定n个点,然后在每个点在一个正方形的上边或者下边的中点,并且所有的正方形等大且不能重叠.求正方形最大的边长是多少. 思路:很明显的二分边长+判定.不过判定要用到2-sat,算是2-sat的入门 ...

  10. 免 Google Play 的安卓应用下载平台

    本文已过时,以后会在我的新博客内更新 https://blog.clso.fun/posts/2019-03-22/non-google-play-apk-download.html 鉴于那啥你懂的原 ...