繁体   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