【发布时间】:2014-12-29 22:51:45
【问题描述】:
我在同一个 ASP.NET 项目中有一个 ApiController 和一个 Controller。我的想法是我想向第三方公开一个 REST API,并在我公开的 REST API 之上构建一个网站。
我想从我的 MVC 控制器(在 ProfileController 中)使用 REST API(在 ProfileApiController 中)。两个控制器都需要经过身份验证,并且 ProfileApiController 的响应取决于处于活动状态的 User.Identity。
我怎样才能做到这一点?
代码如下:
namespace Controllers
{
[Authorize]
public class ProfileApiController : ApiController
{
[Route("api/profile/{param}")]
[HttpGet]
public async Task<IHttpActionResult> GetProfile(string param)
{
return this.Ok<IEnumerable<TransferObject>>( /* business logic */ );
}
}
[Authorize]
public class ProfileController : Controller
{
public async Task<ActionResult> GetProfile()
{
//Pseudocode -- this is what I'm looking for
var api = (reference_to_profileapicontroller);
api.Authenticate(User.Identity);
var m = api.GetProfile("myparameter");
//End Pseudocode
return View(m):
}
}
}
我已经尝试了两种方法:
-
通过HttpClient调用WebApi
HttpClientHandler h = new HttpClientHandler(); var client = new HttpClient(h); var response = client.GetAsync("http://localhost:4827/api/profile/param/").Result; var m = await response.Content.ReadAsAsync<List<TransferObject>>(); return View(m);
但在这里我坚持将身份从 Controller 传递到 ApiController
-
直接调用控制器
var pc = DependencyResolver.Current.GetService<ProfileController>(); var r = await pc.GetTenseProfile("param"); var rr = await r.ExecuteAsync(System.Threading.CancellationToken.None); var m = await rr.Content.ReadAsAsync<List<TransferObject>>(); return View(m);
但这会变成一团糟,因为需要配置 pc.Configuration 和 pc.Request。这应该没那么难吧?
【问题讨论】:
-
您可以创建一个业务层并在两个控制器中调用它
-
那会是什么样子?
-
这是唯一的方法吗?这对我来说似乎很常见?
标签: asp.net-mvc razor asp.net-web-api2 authorize