[英]HttpClient C# Post
我已經用HTTPClient類完成了POST請求,但是現在有點掙扎了。 如何在我的網站上顯示它? 目標是發布json(當前為字符串),然后再次將其顯示在網站上。 如您所見,我的POST命令轉到mvc中的home控制器,然后轉到about操作。 現在如何獲取數據並將其返回到視圖?
public ActionResult About(string json)
像這樣添加參數會起作用嗎? 如果是的話,我該怎么做呢?
這是方法調用:
post(JsonConvert.SerializeXmlNode(pack));
這是方法本身:
async Task post(string jsonText)
{
// Create a New HttpClient object and dispose it when done, so the app doesn't leak resources
using (HttpClient client = new HttpClient())
{
// Call asynchronous network methods in a try/catch block to handle exceptions
try
{
StringContent json = new StringContent(jsonText, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("http://localhost:60000/home/about", json);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
// Above three lines can be replaced with new helper method below
// string responseBody = await client.GetStringAsync(uri);
Console.WriteLine(responseBody);
}catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
}
}
}
更新
我如何給PostAsync命令我自己的課? 它迫使我給它一個HttpContent。
如建議的那樣,我創建了一個新方法來緩存整個數據,但是我必須給哪個參數以保存數據的方法以接收類或httpcontent? (在控制器中)
[HttpPost]
public HttpResponseMessage Data(//What parameter?)
{
//SaveData
return new HttpResponseMessage(HttpStatusCode.OK);
}
因此,我認為您的問題最好問為“如何從MVC控制器返回json”。 如果是這樣,那么看看這個...
返回JSON或部分html的ASP.NET MVC控制器操作
更新#1
因此,我認為OP實際上正在嘗試從控制台應用程序發布,然后能夠查看網站內從該控制台應用程序發送的json?
OP,當控制台應用程序發布數據時,這是單個請求,沒有數據的持久性,除非您將其持久化。 您需要將json字符串存儲在某個地方。 根據需要,它可以是數據庫或某些緩存。
然后,您需要修改About方法,以從該存儲位置檢索json,反序列化並在ViewModel中返回它。
或者,您可以將About方法換為僅檢索json並返回它的API調用-然后,您需要從網頁上實現客戶端get,以從api檢索json並顯示它。
各種選擇,各種優點和缺點,都取決於您的要求。
更新#2
在OP進一步為該答案添加評論...
我建議您定義要在控制台應用程序和MVC應用程序之間發布的數據-不要只使用字符串。 我建議添加第三個項目作為類程序集,並在此處定義該類。 然后,您可以在Console項目和MVC項目中都添加對該新項目的引用,以便它們都可以引用新類。
當前,關於About方法有兩種用法,控制台應用程序是POSTING數據,視圖是GETTING數據-您應該將這些東西分成兩個單獨的方法,並分別用[HttpPost]和[HttpGet]屬性修飾。
更新控制台應用程序以使用您的新類,對其進行序列化並以類似於您當前的方式進行發布-網址應使用上面用[HttpPost]裝飾的方法。
調整[HttpPost]方法,以接收發布的對象並將其存儲在某處。 我覺得這是一個基礎項目,甚至是POC,因此暫時將其緩存。 這是有關緩存的文章
您可能希望將請求放入集合(列表)中,並將集合本身保留在緩存中-這取決於您需要在網頁中顯示的內容。
在[HttpGet]方法中,您現在需要從緩存中檢索所有內容並將其傳遞到ViewModel中-因為您現在應該有一個不錯的MyClass對象(或List),應該可以直接呈現它-實際上VS可能會生成適合您的風景!
在這個線程中確實有太多內容要討論,但是希望這會有所幫助。 我認為不幸的是不可能發布整個代碼示例。
希望雖然不是您一直在尋找的答案,它會有所幫助。
更新#3
好的-我已經創建了一個解決方案,該演示應演示您需要做的事情。
我確信還有其他/更好的方法可以完成您想做的事情...希望這將幫助您理解這些概念。
https://github.com/dotnetter/ConsoleHttpExample
只需克隆存儲庫並在VS中進行配置即可運行網站和控制台應用程序。
您應該像這樣訪問json數據:
public ActionResult Insert(dynamic[] dynamicClass)
{
try
{
//do something...
var movie = //convert dynamicClass to whatever you want... ;
return View(movie);
}
catch (Exception ex)
{
// Otherwise return a 400 (Bad Request) error response
return BadRequest(ex.ToString());
}
}
對於您的問題,如何在視圖中使用,取決於您。 基本上,如果您使用MVC,則可以將其存儲在某個類中並像這樣使用(在cshtml文件中):
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.