将 Asp.Net MVC 控制器转换为 Web API 的最佳方法

2024-01-06

我有这个ASP.NET MVC 5我正在使用 MS Web Api 将其转换为 AngularJS 的项目。

现在在旧项目中我有这些类型的 c# 控制器Controller,但是在我的新项目中,我创建了一些新的 Web Api 控制器类型ApiController.

现在我想在我的新项目中重用旧的控制器代码。我的困惑就在这里。

当我尝试将旧控制器代码移植到我的 Web Api 控制器时,我得到了一些前端$http请求错误。

这是我的 Angular 的一个函数dataService工厂将 http 请求降低到'api/Whatif/SummaryPortfolios':

function getCurrPortfoliosLIst() {
  var deferred = $q.defer();

  var url = 'api/Whatif/SummaryPortfolios';
  var req={
    method: 'POST',
    url: url,
    headers: {
      'Content-Type': 'application/json',
    },
    data:{}
  };
  $http(req).then(function (resp){
    deferred.resolve(resp.data);
  }, function(err){
    console.log('Error from dataService: ' + resp);
  });
}

But the $http错误部分返回此异常:

data: Object
ExceptionMessage: "Multiple actions were found that match the request: 
↵SummaryPortfolios on type MarginWorkbenchNG.Controllers.WhatifController
↵Post on type MarginWorkbenchNG.Controllers.WhatifController"
ExceptionType: "System.InvalidOperationException"
Message: "An error has occurred."
StackTrace: "   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)
↵   at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)
↵   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
↵   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

这是我要调用的 C# API 控制器,但我需要弄清楚如何创建除直接 Get() 和 Post() 方法之外的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using Microsoft.AspNet.Identity;
using NLog;
using Microsoft.AspNet.Identity.Owin;
using MarginWorkbenchNG.Models;
using Rz.DAL;
using Rz.DAL.Integration;
using Rz.DAL.Models;
using Rz.DAL.Models.Rz;

namespace MarginWorkbenchNG.Controllers
{
    public class WhatifController : ApiController
    {
		public IEnumerable<string> Get()
			{						 
				return new string[] { "value1", "value2" };
			}
		[HttpPost]
        public List<WhatifSummaryViewModel> SummaryPortfolios(string filterValue = "", int? whatIfBatchNumber = null, bool includeBaseline = true)
        {
            // Get portfolios from Rz
            IEnumerable<Portfolio> portfolios = GetPortfolios(filterValue, whatIfBatchNumber, includeBaseline)
                .Where(x => x.PortfolioKeys.Any(k => k.Type == Settings.Whatif.SidebarPortfolioKey && k.DisplayValue == filterValue));

            // View Model
            List<WhatifSummaryViewModel> model = new List<WhatifSummaryViewModel> { };

            /// additional code here...

            return model;
        }
	}
}

旧的控制器(来自 MVC5 项目)当然看起来略有不同,因为_Summary方法是类型ActionResult并返回一个Partial:

public class WhatifController : Controller
    {
      
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult _Summary(string filterValue = "", int? whatIfBatchNumber = null, bool includeBaseline = true)
        {
            // Get portfolios from Razor
            IEnumerable<Portfolio> portfolios = GetPortfolios(filterValue, whatIfBatchNumber, includeBaseline)
                .Where(x => x.PortfolioKeys.Any(k => k.Type == Settings.Whatif.SidebarPortfolioKey && k.DisplayValue == filterValue));

            // View Model
            List<WhatifSummaryViewModel> model = new List<WhatifSummaryViewModel> { };

           // additional code removed for brevity...

            return PartialView(model.OrderBy(x => x.Title).ThenBy(x => x.SubTitle));
        }

My RouteConfig.cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MarginWorkbenchNG
{
  public class RouteConfig
  {
    public static void RegisterRoutes(RouteCollection routes)
    {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
    }
  }
}

老项目也是使用Html形式来拉取URL,例如:

 <form id="whatif-summary-form" action="@Url.Action("_Summary", "WhatIf")" method="POST"></form>

然后拉actionattrib 在 JavaScript(非 Angular)中构建 ajax 请求时获取 URL:

url: form.prop("action")

这是你的整个 ApiController 吗?您收到的错误消息是因为您的 ApiController 有多个相同类型的方法,并且它无法判断要路由到哪一个。要测试这一点:注释掉除您正在调用的方法之外的所有控制器方法。您不应该再收到该错误。

这是一个简单的修复,只需告诉 web api 如何映射您的路线即可。将属性“[Route("yourroute')]”添加到您的方法中,它应该可以工作。

    public class WhatifController : ApiController
    {
        [HttpPost, Route("Your Route Goes here 'SummaryPortfolios'")]
        public IHttpActionResult SummaryPortfolios(string filterValue = "", int? whatIfBatchNumber = null, bool includeBaseline = true)
        {
            // Get portfolios from Rz
            IEnumerable<Portfolio> portfolios = GetPortfolios(filterValue, whatIfBatchNumber, includeBaseline)
                .Where(x => x.PortfolioKeys.Any(k => k.Type == Settings.Whatif.SidebarPortfolioKey && k.DisplayValue == filterValue));

            // View Model
            List<WhatifSummaryViewModel> model = new List<WhatifSummaryViewModel> { };

            /// additional code here...

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

将 Asp.Net MVC 控制器转换为 Web API 的最佳方法 的相关文章

随机推荐

  • 简单的日期直方图?

    查看按工作日分类的文档 我的数据格式如下 text hi created at 2016 02 21T18 30 36 000Z 为此 我正在使用dateConversion groovy脚本并保存在 ES 5 1 1 的脚本文件夹中 Da
  • 对象上的 Angular firestore array_contains

    我有以下文件 ID 01 Name A1 players active false name dissident active false name ink 用 JSON 写下来 这样更容易理解 现在我想要对 firestore 执行的是对
  • 在 R 中将 ifelse 与日期一起使用[重复]

    这个问题在这里已经有答案了 我有一个日期向量 如果日期早于另一个向量 我想将日期设置为 NA I tried ifelse date vector1 gt date vector2 date vector1 NA 但输出不是日期并且应用as
  • 强制应用程序在 OnCreate 过程中显示任务栏图标

    我用的是delphi XE2 在我的主窗体 OnCreate 过程中 我运行一些重要的元素 例如登录过程等 我的问题是 当我显示登录表单 由 OnCreate 过程调用 时 我的应用程序在任务栏上不可见 当主表单可见时它变得可见 问题是 当
  • Tomcat 7 - 检索 web 应用程序的版本(版本化 WAR)

    我一直无法找到任何简单的方法来确定使用 Tomcat 7 版本命名部署的 WAR 文件的版本字符串 即 app version war 你可以阅读相关内容here http tomcat apache org tomcat 7 0 doc
  • Google Play 服务已过时。需要 11011000 但找到 10289574

    我已经为这个问题苦苦挣扎了大约一周 一直在搜索与此相关的类似主题 但仍然无法解决我的问题 问题是 当我尝试在 Polar m600 磨损或磨损模拟器 Android V 7 1 1 和 API25 上运行我的程序时 他们给我这条消息 Goo
  • 如何在 Spark SQL 中为表添加增量列 ID

    我正在研究 Spark mllib 算法 我的数据集是这种形式 Company XXXX CurrentTitle XYZ Edu Title ABC Exp mnth 还有更多类似的值 我正在尝试将原始代码字符串值转换为数字值 因此 我尝
  • <% %> 标签的实际名称是什么?

    可能是一个多余且无用的问题 但我和我的同事将 称为服务器标签 但它们有实际的名称吗 我见过使用的一种称为酒精标签 根据答案进行编辑 我们在 ASP NET 中引用它们 但我认为如果它们执行相同的工作 它们会在所有语言中使用相同的名称 服务器
  • 从 Firebase 存储中删除包含内容的文件夹[重复]

    这个问题在这里已经有答案了 我可以轻松删除子引用中的文件 但如何从 Firebase Storage 中删除整个文件夹 let postRef FIRStorage storage reference child posts folderN
  • 删除字段并将新字段添加到弹性搜索索引中的映射

    我在第一次为一个字段创建索引时犯了一个错误 我错误地将 评级 字段指定为 字符串 而不是 整数 数据类型 但该字段中存储的数据只是整数 当我尝试计算平均评分聚合时 由于字符串数据类型 它引发了错误 有没有办法在不重新索引的情况下更改字段的数
  • 无法通过 Jenkins 声明式管道在 Docker 映像中作为代理进行 pip 安装

    I have 完后还有通过 Jenkins 声明性管道运行 Docker 的权限问题 我想通过 Docker 容器中的 Jenkins 作业构建和发布 Python 包 pipeline agent docker image python
  • SVH 单元在移动 Safari 中无法正常工作

    Mobile Safari 不区分 CSS 单元svh and dvh 当视口展开 工具栏缩回 时 这些单元应该产生不同的高度 但它们却产生相同的高度 Safari 对这些单位的支持是在 WebKit 博客中宣布 https webkit
  • IIS URL 重写模块:Url.Content() 无法正确解析 CSS/图像路径

    我有一个带有布局页面等的标准 MVC3 项目 现在我需要制作漂亮的 URL 我开始使用 URL 重写模块 我正在尝试翻译http localhost Photographer Pablointo http localhost categor
  • 查找距给定 Lat Lng 位置一定距离内的所有纬度经度位置的算法

    给定具有纬度 经度位置的地点数据库 例如 40 8120390 73 4889650 我如何找到特定位置给定距离内的所有位置 从数据库中选择所有位置 然后一一遍历它们 获取距起始位置的距离 看看它们是否在指定距离内 这似乎不是很有效 有没有
  • EditText 只接受几个字符

    我需要实施一个EditText在 Android 上 它仅接受特定范围的字符 即 S A Q W R B C D E U 在你的程序中使用这两个属性怎么样 EditText android maxLength 1 android digit
  • 如何使用 Node.JS 防止 SQL 注入?

    如何使用 Node JS 选择 MS SQL Server 数据库的一行并防止 SQL 注入 我使用express框架和包mssql https www npmjs com package mssql 这是我现在使用的代码的一部分 可以使用
  • 保留期后的 Kafka 偏移量

    我有一个带有 1 个分区的 kafka 主题 如果其中有 100 条消息 则偏移量将从 0 99 开始 根据 kafka 保留策略 所有消息都将在指定期限后被清除 一旦所有消息都被清除 保留期过后 我将向该主题发送 100 条新消息 现在
  • 访问JS文件中的css变量

    我有一个CSS有一些变量定义的文件 red red color yello yellow color 我可以使用这个变量CSS文件 但我想知道如何在我的JS file 假设您使用的是原生 CSS 变量而不是某些预处理器 请查看这一页 htt
  • 经过一段时间后调度操作

    所以我第一次使用 React 和 Redux 在我的应用程序中 我使用第三方 API 来获取数据等 在这方面一切都很好 然而 像大多数受保护的 API 一样 我需要获取一个短暂的令牌来向 API 发出请求 我想在某种事件上设置一个计时器 以
  • 将 Asp.Net MVC 控制器转换为 Web API 的最佳方法

    我有这个ASP NET MVC 5我正在使用 MS Web Api 将其转换为 AngularJS 的项目 现在在旧项目中我有这些类型的 c 控制器Controller 但是在我的新项目中 我创建了一些新的 Web Api 控制器类型Api