Web API - jQuery风格的帖子从c#客户端

本文关键字:客户端 API jQuery 风格 Web | 更新日期: 2023-09-27 18:10:58

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

Q:如何从c#客户端发布到worker角色中的自托管Web API控制器,而不使用shell类?


我过去曾使用过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)
{
    //...
}

对于我的工作者角色项目,我遵循了ASP上的说明。. NET for Host ASP。. NET WebAPI 2在Azure Worker角色中设置WebAPI。我希望能够以同样的方式从c#客户端访问控制器。然而,关于ASP的文档。从。NET客户端调用Web API使用类,而不是单独的变量。代码示例最终看起来如下所示。编辑:我已经能够成功地使用此方法将数据传递给工作者角色。

//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项目中使用它(在我的情况下,这是一个非常可能的场景)。然而,这些方法不起作用;服务器返回"方法不允许"或者帖子只是挂起。此外,这些帖子似乎并没有出现在小提琴手。编辑:另外,因为这是一个通用的服务器,所以工作者角色和调用c#客户端可能处于不同的解决方案中,因此它们不能共享类定义。此外,只要不需要shell类,在post之前序列化为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);
}

Q:如何从c#客户端发布到worker角色中的自托管Web API控制器,而不使用shell类?


Web API - jQuery风格的帖子从c#客户端

这能解决你的问题吗?

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();
}

您还可以使用这里提到的其他序列化方法