我有一个现有的asp.net-mvc网站,现在我需要公开我的一些外部应用程序调用,这些外部应用程序现在只在我的网站中使用.这一切都发生在我公司内部网内.
我已经阅读了这个 解释Web API与控制器操作以及此SOF问题的页面,这个问题似乎有类似的问题,但答案似乎有些过时.所以我试图确定最新的可用功能是什么是满足我的要求的最简单的解决方案.
在我的情况下,由于我已经在我当前的网站中使用了相同的控制器操作,因此WEB API并没有真正意义,但如果我谷歌搜索任何围绕asp.net-mvc身份验证或安全性我只看到围绕Web API的文章.
鉴于此,我试图找出将我的控制器操作暴露给另一个应用程序的最佳实践.
在一个理想的世界中,您可以像其他人建议的那样将应用程序转换为web api控制器,但为了更加务实,您可以实现一个临时解决方案,通过扩展仅公开所需的调用 ApiController
您没有提到当前应用程序使用的MVC版本,也未提及当前控制器如何将数据返回到Web应用程序.因此,我假设您通过视图模型和剃刀视图返回数据.例如:
public class ProductsController : Controller { public void Index() { var view = new ProductsListView(); view.Products = _repository.GetProducts(); return View(view); } }
假设您现在要通过类似REST的api公开产品列表?首先检查你是否安装了web api(通过nuget)
安装包Microsoft.AspNet.WebApi
(再次,我不确定你所使用的是什么版本的asp.net,因此这个过程可能会因版本而异)
现在在你的 public void Application_Start()
GlobalConfiguration.Configure(WebApiConfig.Register);//add this before! line below RouteConfig.RegisterRoutes(RouteTable.Routes);//this line shld already exist
并在 WebApiConfig
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
我想创建一个名为ApiControllers 的专用文件夹,并添加具有相同名称的控制器; 这样,您可以拥有与不同名称空间中的控制器名称相同的控制器:
namespace YourApp.Web.ApiControllers { [AllowAnonymous] public class ProductsController : ApiController { [HttpGet] public HttpResponseMessage Products() { var result = new ProductResult();//you could also use the view class ProductsListView result.Products = _repository.GetProducts(); return Request.CreateResponse(httpStatusCode, result); } } }
然后,您可以通过此访问 yourapp.com/api/products
nb,尝试减少控制器内部的代码重复 - 这可以通过将公共部分提取到服务类中来实现.