.Net,单页应用程序,请求源

时间:2015-09-23 12:21:44

标签: .net asp.net-web-api cross-domain httpcontext

我目前正在开发一个.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

0 个答案:

没有答案