Yas*_*ser 4 asp.net-mvc asp.net-mvc-4 asp.net-web-api
我正在使用带有Web Api的ASP.NET MVC 4
我有以下ApiController.
public class ProductsController : ApiController
{
public List<Product> GetProducts()
{
return _productService.GetAllProducts();
}
public List<Product> GetProductsFromId(string username)
{
return _productService.GetProductsFromUsername(username);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你在GetProductsFromId(string username)这里看到第二个动作,我需要先传递用户名(即从MVC 3升级之前)我User.Identity.Username用来获取用户名.
在这种情况下我应该如何处理这个问题.
如何传递用户名?有什么我可以做的.
此外,我不想User.Identity.Username在GetProductFromId(string username)方法内部使用,因为它将打败使用web api的整个目的,也不会被测试.
请指导我帮助我.谢谢
Dar*_*rov 13
此外,我不想在GetProductFromId(字符串用户名)方法中使用User.Identity.Username,因为它将破坏使用web api的整个目的,也不会被测试.
这正是你应该使用的:
[Authorize]
public List<Product> GetProductsFromId()
{
string username = User.Identity.Name;
return _productService.GetProductsFromUsername(username);
}
Run Code Online (Sandbox Code Playgroud)
注意该[Authorize]属性.根据您使用的授权方案,User.Identity将以不同方式填充.例如,如果您启用了表单身份验证,那么用户名显然将来自客户端在调用操作时需要传递的表单身份验证cookie.如果您使用的是基本身份验证而不是表单身份验证,则还可以编写自定义处理程序.我在这里写了一个例子.
这并没有打败任何单元测试的目的.这种方法完全可以单元测试.ApiController的User属性是一个可以在单元测试中轻易模拟的IPrincipal.例如Moq:
// arrange
var sut = new ProductsController();
var user = new Mock<IPrincipal>();
var identity = new Mock<IIdentity>();
user.Setup(x => x.Identity).Returns(identity.Object);
identity.Setup(x => x.Name).Returns("john");
Thread.CurrentPrincipal = user.Object;
// act
var actual = sut.GetProductsFromId();
// assert
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4530 次 |
| 最近记录: |