从 MVC 控制器调用 Web API

2024-06-18

我的 MVC 5 项目解决方案中有一个 Web API 控制器。 WebAPI 有一个方法可以将特定文件夹中的所有文件作为 Json 列表返回:

[{"name":"file1.zip", "path":"c:\\"}, {...}]

从我的 HomeController 我想调用这个方法,将 Json 响应转换为List<QDocument>并将此列表返回到 Razor 视图。该列表可能为空:[]如果文件夹中没有文件。

这是 API 控制器:

public class DocumentsController : ApiController
{
    #region Methods
    /// <summary>
    /// Get all files in the repository as Json.
    /// </summary>
    /// <returns>Json representation of QDocumentRecord.</returns>
    public HttpResponseMessage GetAllRecords()
    {
      // All code to find the files are here and is working perfectly...

         return new HttpResponseMessage()
         {
             Content = new StringContent(JsonConvert.SerializeObject(listOfFiles), Encoding.UTF8, "application/json")
         };
    }               
}

这是我的家庭控制器:

public class HomeController : Controller
{
     public Index()
     {
      // I want to call APi GetAllFiles and put the result to variable:
      var files = JsonConvert.DeserializeObject<List<QDocumentRecord>>(API return Json);
      }
 }

最后,这是模型,以防您需要它:

public class QDocumentRecord
{
      public string id {get; set;}
      public string path {get; set;}
   .....
}

那么我该如何拨打这个电话呢?


我想从我的 HomeController 调用此方法并将 Json 响应转换为列表

不,你不知道。当代码触手可及时,您确实不想增加 HTTP 调用和(反)序列化的开销。甚至在同一个程序集中!

你的 ApiController 违背了(我的首选)约定 https://stackoverflow.com/questions/20083598/net-web-api-httpresponsemessage-pattern反正。让它返回一个具体类型:

public IEnumerable<QDocumentRecord> GetAllRecords()
{
    listOfFiles = ...
    return listOfFiles;
}

如果您不希望这样并且您绝对确定需要返回HttpResponseMessage,那么仍然绝对没有需要费心打电话JsonConvert.SerializeObject()你自己 https://stackoverflow.com/questions/12563576/web-api-content-in-httpresponsemessage:

return Request.CreateResponse<List<QDocumentRecord>>(HttpStatusCode.OK, listOfFiles);

话又说回来,您不希望控制器中存在业务逻辑,因此您将其提取到一个为您完成工作的类中:

public class FileListGetter
{
    public IEnumerable<QDocumentRecord> GetAllRecords()
    {
        listOfFiles = ...
        return listOfFiles;
    }
}

无论哪种方式,您都可以直接从 MVC 控制器调用此类或 ApiController:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var listOfFiles = new DocumentsController().GetAllRecords();
        // OR
        var listOfFiles = new FileListGetter().GetAllRecords();

        return View(listOfFiles);
    }
}

但如果你真的真的必须做一个 HTTP 请求,你可以使用HttpWebRequest, WebClient, HttpClient or RestSharp,对于所有这些都有大量的教程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 MVC 控制器调用 Web API 的相关文章

随机推荐

  • F# 之于 IronPython/IronRuby 就像 C# 之于 VB.NET 一样?

    我刚刚听了Chris Smith 谈论 F 的播客 http www code magazine com codecast index aspx messageid 7feb501f 25c8 432a 9624 97082f1e75e8他
  • 在 R 中绘制逻辑回归的两条曲线

    我正在 R glm 中运行逻辑回归 然后我设法绘制结果 我的代码如下 temperature glm glm Response Temperature data mydata family binomial plot mydata Temp
  • 在 Go/ 中创建/更新 google 驱动器权限/ [使用 api 创建电子表格但无法访问它]

    我正在尝试使用 google Drive api 和以下代码创建电子表格 但我无法访问它 update 该文件似乎不在我在这里指定的驱动器中 有人知道为什么会发生这种情况吗 update 在字段中添加了父母 但有 404 错误 说找不到文件
  • 未找到 MSVCP110D.dll

    我正在尝试使用 SFML 制作游戏 我在 Visual Studio 2012 和 Windows 7 上完成了其中的一部分 我尝试在另一台使用 Windows XP 的 PC 上运行游戏 但出现错误 未找到 MSVCP110D dll 我
  • jQuery:在视口中居中 fancybox

    我目前正在使用 fancybox 版本 2 在单击缩略图时显示我的图像 但我似乎无法让 fancybox 位于视口的中间 垂直而言 因为水平方向没问题 我已经尝试了很多事情 这是最新的 CSS fancybox wrap position
  • H2O服务器崩溃

    去年我一直在使用 H2O 我已经厌倦了服务器崩溃 我已经放弃了 夜间发布 因为它们很容易被我的数据集崩溃 请告诉我在哪里可以下载稳定的版本 Charles 我的环境是 Windows 10 企业版 内部版本 1607 具有 64 GB 内存
  • 如何在c#中加载私有ecdsa密钥es256?

    我使用以下命令生成 ES256 私钥和公钥 创建私钥 openssl ecparam genkey name prime256v1 noout out private pem 创建公钥 openssl ec in private pem p
  • 缺少 1 个必需的位置参数 [重复]

    这个问题在这里已经有答案了 class classname def createname self name self name name def displayname self return self name def saying s
  • GitHub Pages (github.io) doxygen 生成的页面未找到 (404)

    我不明白为什么找不到 doxygen 生成的页面 404 它在Github存储库中的路径是https github com AubinMahe AubinMahe github io blob master doxygen html dd
  • ASP.NET Core 应用程序生命周期

    目前是否有关于生命周期的 ASP NET Core 文档 我希望能够在正确的点融入生命周期 它与现有的 ASP NET MVC 5 生命周期相似吗 http www asp azureedge net v 2016 09 01 001 me
  • 如何在 RxSwift 中延迟地从 Collection 中一件一件地发出项目

    我想从anyCollection 创建一个Observable 它会在延迟后一一发出每个元素 另外 在下一步我想对项目 模型 执行一些更新 例如 喂所有狗 一只一只 间隔 5 秒 class Dog var name String var
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • 如何在C#中使用谷歌语音识别API?

    我想从 C 获取音频文件并发送到谷歌语音识别 API 以获得 语音到文本 的答案 我的代码是这样的 try byte BA AudioFile GetFile filename HttpWebRequest HWR SpeechToText
  • 在android 10中设置通知操作的背景颜色

    我已经做到了这一点图片链接 https i stack imgur com o0Cel jpg通过关注这篇文章https medium com dcostalloyd90 show incoming voip call notificati
  • 更改所选控件的输入语言

    我的应用程序中有一个文本区域 我想以编程方式单独设置文本区域的输入语言 而不影响其他控件 不幸的是 您的程序无法完成此操作 用户需要使用 Unicode 键盘或输入法编辑器 IME 由于您使用的是 C Net 平台 因此您的程序已经能够处理
  • C 有标准的队列实现吗?

    是否有 C 语言 附带 的队列数据结构实现 或者我必须开发自己的队列数据结构实现 这是一个学校项目 因此我必须使用标准 gcc 安装中存在的东西 或者必须自己实现一个 其他通用数据结构 如链表 堆栈等 又如何呢 尝试这个 Unix 附带了几
  • 为什么 Javascript 中未定义的变量有时会计算为 false,有时会抛出未捕获的 ReferenceError?

    我读过的所有内容都表明 在 Javascript 中 未定义变量的布尔值是 False 我已经使用过这样的代码数百次 if elem 其目的是 如果 elem 未定义 则将执行块中的代码 它通常可以工作 但有时浏览器会抛出一个错误 抱怨未定
  • 无法使用 CLI Firebase auth:import 命令导入用户帐户

    我需要在 Firebase 中导入用户列表以及电子邮件和密码 我正在尝试使用 CLI auth import 命令在 Firebase 中导入用户 https firebase google com docs cli auth import
  • 有没有办法将 SVG 字符串渲染到 Web Worker 中的 OffscreenCanvas?

    我正在开发一个网页 对 SVG 字符串数据进行一些相当繁重的处理 因为这些字符串的大小可能达到 m bs 所以我想将 SVG 的渲染 取决于浏览器 移至工作人员 以避免阻塞 UI 我的问题是 worker 中无法访问 DOM 元素 有没有办
  • 从 MVC 控制器调用 Web API

    我的 MVC 5 项目解决方案中有一个 Web API 控制器 WebAPI 有一个方法可以将特定文件夹中的所有文件作为 Json 列表返回 name file1 zip path c 从我的 HomeController 我想调用这个方法