我没有收到空响应就无法传递原始主体

时间:2015-05-05 22:21:28

标签: c# asp.net json

我刚刚完成了本教程: http://weblog.west-wind.com/posts/2013/Dec/13/Accepting-Raw-Request-Body-Content-with-ASPNET-Web-API#CapturingtherawRequestBody

我正在尝试完成一个简单的任务:发送一个抽象/原始请求体,而不需要ASP.NET中的愚蠢/无用的中间层,试图将主体内容解释为我已经创建的预定义类。

这是我的超级简单代码ASP.NET似乎%$&#amp;起来:

[HttpPost]
[Route("test")]
public string test([FromBody] string json)
{
    return json;
}

这会让您认为使用以下正文POST到此URI: "trouble shooting fun""{"info":"troubleshooting fun"}"

只会导致这种反应:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 4

{"info":"troubleshooting fun"}

这是你期望从所有其他Web框架(如Django或Ruby-o-Rails)得到的响应,因为它只是有意义,但在ASP.NET Web API中有一个额外的层在幕后工作强制您通过将它们声明为本地类来手动创建请求和响应对象:

public class hardCodedRequestJson
{
    public string keyValuePair { get; set; }
}

所以...嗯,这很酷,如果你想要一些无用的向后兼容XML,但这种方法是以每个API调用的特定参数被困为代价,对于我的情况,我必须制作数百种不同的类和函数组合,以解释客户端在向服务器进行API调用时必须具有的动态可能性。

如何将我想要的任何类型的JSON对象提供给ASP.NET Web API控制器并获取我请求的那个EXACT json作为响应?

2 个答案:

答案 0 :(得分:1)

我已经想出了一个非常干净的方法来做到这一点,虽然感觉非常尴尬:

public async Task<string> PostRawBufferManual()
{
    string result = await Request.Content.ReadAsStringAsync();
    return result;
}

允许你像这样制定一个请求:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET *farting noise"
Date: Tue, 05 May 2015 23:37:21 GMT
Content-Length: 30

"{\"info\":\"This simple task took longer than it should've\"}"

答案 1 :(得分:0)

如果要绕过邮件格式,则需要直接使用邮件类型。

接受if objA is objB then ... 作为参数和HttpRequestMessage 然后,将await request.Content.ReadAsStringAsync()与您的身体和身体一起返回内容类型。