Asp.net web api 在ASPNET Web API中映射URL编码的POST值

Asp.net web api 在ASPNET Web API中映射URL编码的POST值,asp.net-web-api,Asp.net Web Api,我在Web API控制器中有一个POST操作。收到的标题是 Connection: Close Content-Length: 19094 Content-Type: application/x-www-form-urlencoded Expect: 100-continue Host: xxxxxxxxxxxxx.co.uk 在我的IIS日志中,我可以看到一般请求实体 "This is some posted data" 但是,我似乎无法使用web api控制器获取这段数据 public

我在Web API控制器中有一个POST操作。收到的标题是

Connection: Close
Content-Length: 19094
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
Host: xxxxxxxxxxxxx.co.uk
在我的IIS日志中,我可以看到一般请求实体

"This is some posted data"
但是,我似乎无法使用web api控制器获取这段数据

public HttpResponseMessage Post([FromBody] string value)
发送的数据似乎不符合要求的格式。根据我的理解,微软决定任何发布到FromBody属性的内容都需要加上“=”前缀,例如

但是,我正在接收的数据(来自我无法控制的源)不包含“=”

因此,我的web api方法完全忽略发送的数据。我尝试切换到使用FormDataCollection,但由于我接收的数据没有指定键,因此该值似乎最终出现在键字段中,这似乎有点奇怪

public HttpResponseMessage Post(FormDataCollection form)
{
    string extracted = form.ReadAsNameValueCollection().GetKey(0);
}
我已经尝试过创建一个类/复杂类型来包装它,但是由于发布的数据不包含键,所以它似乎永远不会匹配

我错过了什么明显的东西吗。我只是想把这段数据作为字符串发布到我的web服务上?谢谢你的帮助

使现代化 经过多次搜索,我发现一些人也有同样的问题,他们似乎不得不向上移动一点,使用HttpRequestMessage。显然并不理想,因为这让单元测试有点像噩梦

public HttpResponseMessage Post(HttpRequestMessage message)
{
    string extracted = message.Content.ReadAsStringAsync().Result;
}
如果有人有更好的方法来实现这一点,请让我知道。

处理WebApi中的帖子


不是更好的方式,而是一句话。不要使用
Result
,因为这会导致代码阻塞;正确使用async/await。非常感谢您的提醒,让您惊讶的是,通过一点复制和粘贴,您错过了什么。非常感谢,但为此,发布的内容需要提供数据未指定的参数名(用户名或密码)。
public HttpResponseMessage Post(FormDataCollection form)
{
    string extracted = form.ReadAsNameValueCollection().GetKey(0);
}
public HttpResponseMessage Post(HttpRequestMessage message)
{
    string extracted = message.Content.ReadAsStringAsync().Result;
}
 public class LoginData
 {
     public string Username { get; set; }
     public string Password { get; set; }
 }

 [HttpPost]
public HttpResponseMessage Authenticate(LoginData login)
{
string username = login.Username;
string password = login.Password;
…
}