c# - 从代码和网站调用Web API

标签 c# javascript asp.net-mvc-4 c#-4.0 asp.net-web-api

首先,我使用 C# 4.0 作为我的编码语言。我相信我看到了一些答案,其中 4.5 引入了一些可以使这变得更容易的方法,但这不是我要求更改框架的呼吁。

我正在创建一个 MVC4 WebApi,它将由网站和 C# 代码(在另一个项目中)使用。通常,当从 JavaScript 调用它时,我会这样做:

$.ajax({
    dataType: 'text',
    url: '//localhost:56814/corporations/1/divisions',
    type: 'POST',
    data: {"Divisions":[{"Name":"In Store"},{"Name":"Online"}]}
}).done(function (msg) {
    alert(msg);
}).fail(function (jqXHR, textStatus) {
    alert('Request failed: ' + textStatus);
});

然后在我的服务器端代码中,我只需将我的模型作为参数:

[HttpPost]
public HttpResponseMessage Divisions(int id, DivisionCollectionModel model) {

}

该模型将定义如下:

public class DivisionCollectionModel {
    public IEnumerable<DivisionModel> Divisions { get; set; }
}

public class DivisionModel {
    public string Name { get; set; }
}

现在,当我尝试从代码中测试调用此方法时,我找到的使调用正常工作的唯一方法如下:

public static void TestWebApiPost() {
    var divs = new DivisionCollectionModel {
        Divisions = new DivisionModel[] {
            new DivisionModel {
                Name = "In Store"
            },
            new DivisionModel {
                Name = "Online"
            }
        }
    };

    using (var client = new HttpClient()) {
        var content = JsonConvert.SerializeObject(divs);
        var response = client.PostAsync("http://localhost:56814/corporations/1/divisions", new StringContent(content)).Result;
        Console.WriteLine(response.ToString());
    }
}

不幸的是,无法找到 URL,因为我的消息内容是字符串而不是对象。

Is there a method call, or version of HttpContent that I'm missing here in how I'm sending the data over that would allow me to send it as an object instead of a string?

我重新设计了上面的 Api 方法来接受 HttpRequestMessage作为第二个参数,计算出这将允许我使用 request.Content.ReadAsStringAsync().Result从请求中获取对象。这对于从 C# 客户端调用它非常有效。但是,当我尝试使用 JavaScript 对象调用它时,我得到以下内容作为我的 Result :

"Divisions%5B0%5D%5BName%5D=In+Store&Divisions%5B1%5D%5BName%5D=Online"

我尝试通过 System.Web.HttpUtility.HtmlDecode() 运行它和System.Net.WebUtility.HtmlDecode() ,但两者都没有改变该字符串上的编码。

更新 写完这篇文章后我意识到我试图转换的字符串是一个 Url,而不是一个 Html 字符串。然后我尝试使用 System.Web.HttpUtility.UrlDecode() ,这给了我这个:

"Divisions[0][Name]=In Store&Divisions[1][Name]=Online"

不幸的是,当尝试通过 Newtonsoft.Json.JsonConvert.DeserializeObject<DivisionCollectionModel>() 运行它时,也会引发异常。 .

更清晰的问题集 我认为最好修复从 C# 客户端进行调用的方式,这样我就不必解析 HttpRequestMessage ,并允许 Controller 为我做这个“繁重的工作”。但是,如果没有办法将我的数据作为 object 发送过来而不是string在 C# 4.0 中,最简单的解决方案是让 JavaScript 客户端发送字符串而不是对象。

我的 C# 客户端代码中是否缺少某些内容?

最佳答案

更改ajax数据类型 数据类型:'json',

关于c# - 从代码和网站调用Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25974979/

相关文章:

Javascript:空对象是假对象吗?

javascript - 使用 jQuery 从键对值中获取值到附加属性中

c# - 在 Asp.Net Mvc 4 中使用 Cookie

c# - 十进制?字符串删除尾随零的 C#

c# - 当我知道成员名称时访问动态对象成员的最佳方法?

c# - 在 MVC4 中显示 viewbag 列表中的 ListView

c# - 这个开关盒怎么有无法访问的代码?

javascript - 为主体上添加的每个新元素添加事件监听器

html - CSS @Styles.Render 不呈现样式表

c# - 将 X-Frame-Options header 添加到 MVC 4 应用程序中的所有页面