Javascript 将JSON字符串发布到WEB API

Javascript 将JSON字符串发布到WEB API,javascript,json,asp.net-web-api2,Javascript,Json,Asp.net Web Api2,我有一个ASP.NET WEB-API 2应用程序,它需要有一个POST方法来接受JOSN字符串,该字符串的结构未知,来自javascript 我启用了cors和GET方法,但从客户端发送JSON时,api的方法参数始终为null 这是我的api方法: //parameters i tried: //[FromBody]string model //[FromBody]dynamic model //dynamic model public HttpResponseMessage Post(st

我有一个
ASP.NET WEB-API 2
应用程序,它需要有一个
POST
方法来接受
JOSN
字符串,该字符串的结构未知,来自
javascript

我启用了
cors
GET
方法,但从客户端发送
JSON
时,api的方法参数始终为
null

这是我的
api
方法:

//parameters i tried:
//[FromBody]string model
//[FromBody]dynamic model
//dynamic model
public HttpResponseMessage Post(string model)
{
    return new HttpResponseMessage()
    {
        Content = new StringContent("POST: Test message: " + model)
    };
}
和我的客户方法:

function sendRequest()
{
    var Test = {"Name":"some name"};
    var method = $('#method').val();

    $.ajax({
        type: method,
        url: serviceUrl,
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(Test)               
    }).done(function (data)
    {
        $('#value1').text(data);
    }).error(function (jqXHR, textStatus, errorThrown)
    {
        $('#value1').text(jqXHR.responseText || textStatus);
    });
}

所以问题是我如何从
javascript
发布一个未知的
JSON字符串
,并在我的
api
方法中将其作为字符串接受?

我编辑了你的代码,它工作得很好

[FromBody]属性指定操作参数仅来自传入HTTPRequestMessage的实体体

public class TestApiController : ApiController
    {
        // POST api/<controller>
        [HttpPost]
        public HttpResponseMessage Post([FromBody]string value)
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent("POST: Test message: " + value)
            };
        }

    }

function sendRequest() {
    var Test = { "Name": "some name" };

    $.ajax({
        type: "POST",
        url: "api/TestApi",
        data: { '': JSON.stringify(Test) }
    }).done(function (data) {
        alert(data);
    }).error(function (jqXHR, textStatus, errorThrown) {
        alert(jqXHR.responseText || textStatus);
    });
}
public类TestApiController:ApiController
{
//后api/
[HttpPost]
公共HttpResponseMessage Post([FromBody]字符串值)
{
返回新的HttpResponseMessage()
{
内容=新的StringContent(“POST:测试消息:”+值)
};
}
}
函数sendRequest(){
var Test={“Name”:“some Name”};
$.ajax({
类型:“POST”,
url:“api/TestApi”,
数据:{'':JSON.stringify(测试)}
}).完成(功能(数据){
警报(数据);
}).error(函数(jqXHR、textStatus、errorshown){
警报(jqXHR.responseText | | textStatus);
});
}

将POST请求视为一般HTTP请求,并手动解析正文:

public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
    var jsonString = await request.Content.ReadAsStringAsync();

    // deserialize the string, or do other stuff

    return new HttpResponseMessage(HttpStatusCode.OK);
}
注意:通过这种方式,您不需要修改客户端代码,因为您仍然在发布json数据,而不是通用字符串,如果您希望客户端发布序列化的json对象,这在语义上是正确的选择

参考资料:


尝试
数据:{model:JSON.stringify(Test)}
这给了我一个
对飞行前请求未通过访问控制检查的响应:请求的资源上没有“access control Allow Origin”头
错误消息Don t JSON.stringify。在控制器中使用数据:{value:Test}和([FromBody]字符串测试)。应该返回一个字符串。不要使用JOSN contentType。只需发布一个json格式的字符串,然后使用JsonConvert.DeserializeObject将其转换为您期望的对象。@MarcusH尝试了,但仍然得到一个空值。我尝试了您的建议,效果良好。但我想找到一个解释。您提供的链接包含malware@ChristophAdamakis :
public HttpResponseMessage Post([FromBody] JToken model)
{
    DoStuff(model);

    var myField = model["fieldName"];

    return new HttpResponseMessage(HttpStatusCode.OK);
}