gpt4 book ai didi

asp.net-mvc - 如何在 Asp.net MVC 中添加 Web Api,然后在同一个应用程序中使用 WebAPI

转载 作者:行者123 更新时间:2023-12-04 21:16:50 26 4
gpt4 key购买 nike

我已经实现了创建 WebApi 本身,我可以从浏览器浏览它并获得输出。

对我不起作用的是我试图从 MVC Controller 使用 WebAPI,并且我已经编写了在“cshtml” View 中调用 WebAPI 的代码。

但它不起作用,因为我在加载页面时遇到错误,我知道我做错了什么。所以第一个问题是:我这样做是正确的,还是在 MVC 项目中创建一个 WebAPI 部分然后尝试从 Controller 在同一个 MVC 项目中使用它是完全错误的?

最佳答案

要回答您的问题,它实际上是“按设计”的,并建议将您的 WebAPI 和 MVC 客户端放在同一个项目中。这就是为什么你们同时拥有 RouteConfig.cs和一个 WebApiConfig.cs在您的 MVC 项目中。 RouteConfig.cs用于您的 MVC Controller ,以及 WebApiConfig.cs显然适用于您的 Api Controller 。

在同一个项目中拥有两者很容易。我所做的是在我的根目录中添加一个名为“API”的文件夹,并将我所有的 WebAPI Controller 放在那里。请记住,我相信您知道,WebAPI Controller 和 MVC Controller 之间的唯一区别是 WebAPI Controller 继承 ApiController这是 System.Web.Http 的一部分(我相信)而 MVC Controller 继承了 Controller这是 System.Web.MVC 的一部分.

以下是发出 GET/PUT/DELETE/POST 请求的正确方法 您的 WebAPI 发件人 一个MVC前端。它是否在同一个项目中并不重要,因为您在 Controller 的构造函数中指定了 WebAPI URL。如果您的 WebAPI 与前端 MVC 应用程序位于不同的服务器上,则您需要启用 CORS 支持,这是 WebAPI 版本 2 及更高版本中提供的一项功能。

这是从前端 MVC 客户端调用 WebAPI 的正确方法。

在您的 Controller 页面中,删除与 DbContext、 Entity Framework 等有关的任何内容。原因是默认情况下, Controller 希望通过调用 DbContext 来执行 CRUD 操作,而我们不希望这样。我们想调用 WebAPI 来代替它。当我提到“ Controller ”时,我指的是 MVC Controller ,而不是 WebAPI Controller 。

首先,在您的 MVC Controller 中声明一些成员变量。 MVC Controller 的其余部分将使用这些:

    HttpClient client = new HttpClient();
HttpResponseMessage response = new HttpResponseMessage();
Uri contactUri = null;
  • 在您的 MVC Controller 中,为您的 Controller 创建一个构造函数,如下所示:
    public ContactController()
    {
    // set base address of WebAPI depending on your current environment
    // the URL below, if the API is in the same project, will be something
    // like "http://server/YourProjectName" - replace server with either
    // "localhost", etc.
    client.BaseAddress = new Uri("http://server/YourAPI/");

    // Add an Accept header for JSON format.
    client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json"));
    }
  • 将 Index 操作的代码替换为以下内容。请注意,唯一相关的部分是 client.GetAsync()调用和var contacts任务。对于此问题的上下文,其他所有内容都不是必需的。 client.GetAsync() 里面的值应该是您的 Controller 的名称,由您在 WebApiConfig.cs 中设置的任何自定义路由开头 - 在我的情况下,我添加了 api加入我的路线以区分 API 调用和正常调用:
    public ActionResult Index()
    {
    response = client.GetAsync("api/contact").Result;
    if (response.IsSuccessStatusCode)
    {
    var contacts = response.Content.ReadAsAsync<IEnumerable<Contact>>().Result;
    return View(contacts);
    }
    else
    {
    // add something here to tell the user hey, something went wrong
    return RedirectToAction("Index");
    }
    }
  • 将 Create 操作(HttpPost 操作)替换为如下所示的内容。同样,唯一重要的部分是 client.PostAsJsonAsync()部分 - 这就是调用 WebAPI 的 POST 操作的原因,在我的情况下,它负责将新记录插入到数据库中:
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Contact contact)
    {
    // Create a new product
    response = client.PostAsJsonAsync("api/contact", contact).Result;
    if (response.IsSuccessStatusCode)
    {
    return RedirectToAction("Index");
    }
    else
    {
    // add something here to tell the user hey, something went wrong
    return RedirectToAction("Index");
    }
    }
  • 将 Edit 操作(非 HttpPost 操作)替换为如下所示的内容。这有点棘手,因为为了进行编辑,您必须首先检索记录,因此基本上,编辑的 HttpPost 版本将包含一些类似的代码,并带有执行编辑 POST (PUT) 的附加代码行。下面,我们通过向 WebAPI 传递特定的记录 ID 来获取响应。因此,就像索引 (GET) 一样,我们正在做同样的事情,只是传入 ID,因此我们只能取回一条记录。然后,我们将响应转换为可以在 View 中操作的实际对象:
    public ActionResult Edit(int id = 0)
    {
    response = client.GetAsync(string.Format("api/contact/{0}", id)).Result;
    Contact contact = response.Content.ReadAsAsync<Contact>().Result;
    if (contact == null)
    {
    return HttpNotFound();
    }
    return View(contact);
    }
  • 将 Edit 操作(HttpPost 操作)替换为如下所示的内容。下面,我们通过调用 client.GetAsync() 来获取要编辑的记录。并将主键作为参数(contact_id)传入。然后,我们从该响应中获取 RequestUri 并保存它。然后,我们调用 client.PutAsJsonAsync()并传入 Uri.PathAndQuery(我们刚刚保存的内容)以及要编辑的对象。
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(Contact contact)
    {
    response = client.GetAsync(string.Format("api/contact/{0}", contact.contact_id)).Result;
    contactUri = response.RequestMessage.RequestUri;
    response = client.PutAsJsonAsync(contactUri.PathAndQuery, contact).Result;
    if (response.IsSuccessStatusCode)
    {
    return RedirectToAction("Index");
    }
    else
    {
    // add something here to tell the user hey, something went wrong
    return RedirectToAction("Index");
    }
    }
  • 将删除操作(非 HttpPost 操作)替换为以下内容。因此,我们再次通过简单地调用 client.GetAsync() 从数据库中获取记录。并将其转换为我的应用程序知道的实际对象。
    public ActionResult Delete(int id = 0)
    {
    response = client.GetAsync(string.Format("api/contact/{0}", id)).Result;
    Contact contact = response.Content.ReadAsAsync<Contact>().Result;

    if (contact == null)
    {
    return HttpNotFound();
    }
    return View(contact);
    }
  • 最后,将删除操作(HttpPost 操作)替换为如下所示的内容。同样,我们正在做一些类似于 Edit 操作的操作。我们正在删除要删除的记录,将其转换为一个对象,然后将该对象传递给 client.DeleteAsync()调用,如下图。
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
    response = client.GetAsync(string.Format("api/contact/{0}", id)).Result;
    contactUri = response.RequestMessage.RequestUri;
    response = client.DeleteAsync(contactUri).Result;
    return RedirectToAction("Index");
    }
  • 关于asp.net-mvc - 如何在 Asp.net MVC 中添加 Web Api,然后在同一个应用程序中使用 WebAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21289205/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com