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

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

  在如何发送数据的过程中,是否缺少方法调用或HttpContent版本,以便我可以将其作为对象而不是字符串进行发送?

我对上面的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为我执行“繁重的任务”。但是,如果在C#4.0中没有办法以object而不是string的形式发送数据,则最简单的解决方案是让JavaScript客户端通过字符串而不是对象发送。

我在C#客户端代码中缺少什么吗?

参考方案

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

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

我需要帮助将此REST API Curl命令转换为Python请求 - python

我在这里是新手,老实说对所有编码都是新手。我正在尝试创建一个Pyton脚本,以使用REST API从Request Tracker资产数据库中搜索项目。到目前为止,我得到了以下Curl命令:curl -X POST \ -H "Content-Type: application/json" \ -d '[{ "fiel…

asp.net:treeview-显示文本框是否选中? - c#

我需要向用户显示字符串列表。用户可以选择多个字符串。如果选择了一组特定的字符串,则每个字符串旁边都会出现一个文本框。我想做的是向用户显示一个TREEVIEW,每个节点都是字符串之一。他们将通过选中复选框来选择所需的每个字符串。问题:如果用户选择特定的复选框,则我需要一个文本框来显示用户的GET输入。问题:如何从用户使用树形视图获取字符串输入? 参考方案 Tr…

重复使用Google Api Bearer令牌来访问用户的云端硬盘 - javascript

我有以下几点: gapi.auth.authorize( { client_id: CLIENT_ID, scope: SCOPES, immediate: false }, handleAuthResult); 这使我可以访问access_token:目标是使该应用程序的用户可以授予对我的应用程序的访问权限,以使用其Google驱动器存储其内容。我需要能够…

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…