簡體   English   中英

HttpClient C#發布

[英]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,因此暫時將其緩存。 這是有關緩存的文章

在ASP.NET Core中緩存內存

您可能希望將請求放入集合(列表)中,並將集合本身​​保留在緩存中-這取決於您需要在網頁中顯示的內容。

在[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM