首先,我使用 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/