尽管已启用CORS,但无法使用ajax发布到其他域

时间:2017-10-20 16:20:29

标签: c# asp.net-web-api2

我正在使用MVC.net并将发布数据发送到我的Web API 2控制器。我一直收到500内部服务器错误消息。

如果重要的话,我想发布到另一个域名?我有2个visual studio实例在运行,一个充当客户端,另一个充当服务器。我启用了CORS。

GET可以正常使用此设置,但现在我正试图发布。

'服务器'上的我的控制器是

[HttpPost]
[Route("api/cms/")]
public IHttpActionResult Post([FromBody]int accountId, [FromBody]string content, [FromBody]string paneId, [FromBody]string url)
{
    //content
}

我正在使用的“客户端”上的javascript是

function ajaxStart(type, url, data, successDelegate, failDelegate, errorDelegate) {
    $.ajax({
        type: type.toUpperCase(),
        url: url,
        contentType: "application/json;charset=utf-8",
        data: data,
        dataType: "json",
        success: function (response) {
            successDelegate(response);
        },
        failure: function (e) {
            failDelegate(e.statusText);
        },
        error: function (e) {
            errorDelegate(e.statusText);  //always hit
        }
    })
}

创建数据(我故意使用无意义的字符串,以确保格式没有错误)

var data = JSON.stringify({ accountId: 1, paneId: "_selectedPaneNumber", url: "_url", content: "content" });

Google Chrome开发工具中的“标题”视图显示:

enter image description here

我不知道我做错了什么。

2 个答案:

答案 0 :(得分:4)

客户端的javascript看起来很好。问题似乎与ApiController的动作和参数绑定有关。

  

最多允许一个参数从邮件正文中读取。所以这不起作用:

public IHttpActionResult Post([FromBody]int accountId, [FromBody]string content, [FromBody]string paneId, [FromBody]string url) { ... }
  

此规则的原因是请求正文可能存储在只能读取一次的非缓冲流中。

来源:Parameter Binding in ASP.NET Web API : Using [FromBody]

考虑在动作服务器端创建模型

public class MyModel {
    public int accountId { get; set; }
    public string content { get; set; }
    public string paneId { get; set; }
    public string url { get; set; }
}

并更新行动以期待。

[HttpPost]
[Route("api/cms/")]
public IHttpActionResult Post([FromBody] MyModel model) { 
    //code removed for brevity
}

答案 1 :(得分:1)

如果你想在身体发送一个字符串,请执行以下操作:

  • 添加标题:Content-Type: application/x-www-form-urlencoded
  • 更改正文中的字符串值,使其前缀为=字符:=5