我目前正在开发一个.Net WebAPI,允许用Angular编写的单页面应用程序与业务来回交换数据。
SPA的特殊之处在于始终在不同的域下运行(我已经为给定的域列表启用了CORS)。因此,我的API将始终根据请求的来源寻址数据,例如:
request origin domainId
-------------- --------
https://www.client1.com -> client1.com
https://client1.com -> client1.com
https://www.client2.xxx -> client2.com
目前,我创建了一个基于给定请求恢复domainId的实用程序类:
public static class DomainId
{
public static string Get(HttpRequestMessage Request)
{
InMemoryDomainRepository repo = new InMemoryDomainRepository();
try
{
IEnumerable<string> headerValues = Request.Headers.GetValues("Origin");
var origin = headerValues.FirstOrDefault();
return repo.GetDomainId(origin);
}
catch
{
return repo.GetDomainId("http://client1.com");
}
}
然后,在控制器中,为了获得特定的userProfile,我将使用我的实用程序类:
[Authorize]
public IHttpActionResult GetProfile()
{
var domainId = DomainId.Get(Request); // uses the utility class above
IClientRepository repo = new ClientRepositoryAx30();
var client = repo.GetClient(domainId, User.Identity.Name);
return Ok(client);
}
问题:
编写测试用例时,没有来源,因为我没有在浏览器中查询API。 那么如何指定请求的来源?据我所知,到目前为止,无法像这样设置原点:
Request.Headers.SetValues("Origin", "https://client1.com");
从原点(Request.Headers.GetValues("Origin");
)中提取DomainId是我迄今为止找到的最佳方法。但也许有更好的解决方案?
我目前坚持使用以下测试方法:
[TestClass]
public class ClientControllerTests
{
[TestMethod]
public void TestGetProfile()
{
var identity = new GenericIdentity("Bob");
Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
// how to set a Generic Domain?
var ctrl = new ClientController();
var result = ctrl.GetProfile();
IHttpActionResult actionResult = ctrl.GetProfile();
System.Diagnostics.Debug.WriteLine(actionResult);
//Assert.IsInstanceOfType(actionResult, typeof(OkResult));
}
}
我希望能够指定一个“通用”域,就像我定义“通用身份”一样
非常感谢任何帮助。
最佳, Mikou