2014-07-01 46 views
0

我有一個簡單的Azure工作者角色,我想在其中託管Web API。我想設置Web API控制器,以便可以像訪問jQuery一樣訪問它們,這樣我就不必創建shell類,並且我的Web API可以保持靈活性,以便將來可以與jQuery一起使用。Web API - 來自C#客戶端的jQuery樣式發佈

問:如何在不使用shell類的情況下從C#客戶端發佈到工作角色中的自承載Web API控制器?


我在它在常規ASP.NET項目的託管過去使用Web API的工作,我能夠通過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); 

因爲我不想創建我的代碼中多處不必要的貝殼類,我想這樣做以下。這樣做也保持了我的Web API的靈活性,以便將來可以從基於Web的jQuery項目中使用它(在我的情況下,這是一個非常可能的場景)。但是,這些方法不起作用;該服務器返回一個「方法不允許」或該帖子只是掛起。此外,這些帖子似乎並沒有在小提琴手中出現。編輯:此外,因爲這是一個通用的服務器,所以Worker角色和調用的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); 
} 

問:我如何從一個C#的客戶端上傳到工人的角色自託管的Web API控制器,無需使用貝殼類?


回答

0

難道這能解決您的問題嗎?

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

+0

更新了匿名類型的序列化解決方案並提出了其他序列化方法。 – Juliano

+0

您是否正在嘗試使用test.myapi.com或您自己的api? – Juliano

+0

當我僅使用字符串而不是序列化時,它在我以前的編輯中工作過嗎? – Juliano