【问题标题】:Web API - jQuery Style Post from C# ClientWeb API - 来自 C# 客户端的 jQuery 样式发布
【发布时间】:2014-07-01 23:15:33
【问题描述】:

我有一个简单的 Azure 辅助角色,我想在其中托管 Web API。我想设置 Web API 控制器,这样我就可以像访问 jQuery 帖子一样访问它们,这样我就不必创建 shell 类,并且我的 Web API 可以保持灵活,以便将来与 jQuery 一起使用。

问:如何在不使用 shell 类的情况下,从 C# 客户端发布到作为辅助角色的自托管 Web API 控制器?


我过去使用过 Web API,它托管在常规 ASP.NET 项目中,我可以通过 jQuery 访问它,执行以下操作:

//Web API Controller
public class TestController : ApiController
{
    public void Post(string item, string action)
    {
        //...
    }
}

//jQuery
$.post("/api/test/", { item: "myItem", action: "someAction" }, function (data)
{
    //...
}

对于我的工人角色项目,我按照Host ASP.NET Web API 2 in an Azure Worker Role 的 ASP.NET 上的说明设置了 WebAPI。我希望能够从 C# 客户端以相同的方式访问控制器。但是,Calling a Web API from a .NET Client 的 ASP.NET 文档使用类,而不是单个变量。代码示例最终看起来如下所示。编辑:我已经能够成功地使用这种方法将数据传递给工作角色。

//Shell Object
public class ShellObject
{
    public string item;
    public string action
}

//Web API Controller
public class TestController : ApiController
{
    public void Post(ShellObject shellObject)
    {
        //Unpack object, then do action
        //...
    }
}

//C# Client
ShellObject shellObject = new ShellObject() { item = "myItem", action = "someAction" }
var response = await client.PostAsync("api/test/", shellObject);

因为我不想在我的代码中的多个位置创建不必要的 shell 类,所以我想做如下的事情。这样做还可以使我的 Web API 保持灵活性,以便将来可以从基于 Web 的 jQuery 项目中使用它(在我的情况下这是一个非常可能的场景)。但是,这些方法不起作用;服务器返回“不允许的方法”或帖子挂起。此外,这些帖子似乎没有出现在 Fiddler 中。编辑:此外,因为这是一个通用服务器,所以工作角色和调用 C# 客户端可能在不同的解决方案中,因此它们不能共享类定义。此外,只要不需要 shell 类,在发布之前序列化为 JSON 即可。

//Web API Controller
public class TestController : ApiController
{
    public void Post(string item, string action)
    {
        //...
    }
}

//Simple Post
using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["item"] = "myItem";
    data["action"] = "myAction";

    var response = wb.UploadValues("http://workerroleaddress/api/test/", "POST", data);
}

问:如何在不使用 shell 类的情况下,从 C# 客户端发布到作为辅助角色的自托管 Web API 控制器?


【问题讨论】:

    标签: c# jquery asp.net azure asp.net-web-api


    【解决方案1】:

    这能解决你的问题吗?

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://test.myapi.com");
    
        var serializer = new JavaScriptSerializer();
        var json = serializer.Serialize(new { action = "myAction", item = "myItem" });
    
        client.PostAsync("api/test", 
            new StringContent(json, Encoding.UTF8, "application/json")).Wait();
    }
    

    您还可以使用here 中提到的其他序列化方法。

    【讨论】:

    • 更新了从匿名类型序列化的解决方案,并建议了其他序列化方法。
    • 您是针对 test.myapi.com 还是您自己的 api 进行尝试?
    • 在我之前的编辑中,当仅使用字符串而不是序列化时,它是否有效?
    • 我没有尝试过,但我只是这样做了。相同的消息,HTTP 405,不允许的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2013-05-22
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多