在ASPNET Web API中映射UrlEncoded POST值

时间:2014-10-14 10:37:12

标签: 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日志中,我可以看到GENERAL_REQUEST_ENTITY为

"This is some posted data"

但是我似乎无法使用我的web api控制器获取这段数据。

public HttpResponseMessage Post([FromBody] string value)

发送的数据似乎不符合要求的格式。根据我的理解,Microsoft决定发布到FromBody属性的任何内容都需要以" ="为前缀。 e.g。

="This is some posted data"

但是我收到的数据(来自我无法控制的来源)不包含" ="。

"This is some posted data"

我的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;
}

如果有人有更好的方法来实现这一点,请告诉我。

1 个答案:

答案 0 :(得分:0)

在Web Api中处理POST link

 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;
…
}