我有一个ApiController和一个控制器在同一个ASP.NET项目。我的想法是,我想将REST API公开给第三方,并在我公开的REST API之上构建一个网站。从MVC消费授权WebAPI 2
我想从我的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的
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);
但在这里,我坚持从控制器传递身份到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需要配置。这不应该这么难吗?
你可以创建一个业务层,并在两个控制器中调用它 –
看起来像什么? –
这是唯一的方法吗?这对我来说似乎是一种常见的情况? –