Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何基于域或主机应用程序动态更改Angularjs服务上的API端点_Asp.net Mvc_Angularjs_Asp.net Web Api2 - Fatal编程技术网

Asp.net mvc 如何基于域或主机应用程序动态更改Angularjs服务上的API端点

Asp.net mvc 如何基于域或主机应用程序动态更改Angularjs服务上的API端点,asp.net-mvc,angularjs,asp.net-web-api2,Asp.net Mvc,Angularjs,Asp.net Web Api2,我有一个使用Angularjs和web API的MVC web应用程序,这两个应用程序都发布在不同的域中。每次我提交代码更改时,TFS都会发布MVC应用程序和Web API,并使用Web.config转换更改Web配置连接和应用程序键,以指向开发人员、生产或测试 现在我使用angular,我有了一个指向API端点的服务来执行一些操作,例如登录 正如您所看到的,baseUri设置为localhost,但我希望它在生产环境中具有类似于var baseUri=”的功能http://productio

我有一个使用Angularjs和web API的MVC web应用程序,这两个应用程序都发布在不同的域中。每次我提交代码更改时,TFS都会发布MVC应用程序和Web API,并使用Web.config转换更改Web配置连接和应用程序键,以指向开发人员、生产或测试

现在我使用angular,我有了一个指向API端点的服务来执行一些操作,例如登录

正如您所看到的,baseUri设置为localhost,但我希望它在生产环境中具有类似于
var baseUri=”的功能http://production/“
和用于测试
baseUri=”http://testing/“
。因此baseUri的更改取决于TFS发布的内容

请记住,MVC应用程序所在的域与WebAPI不同,因此我无法检查角度范围的域并构建基本URI


谢谢

您能在MVC应用程序的域上进行切换,并根据哪个域为API构建URI吗

比如:

switch (MVCdomain) {
    case "http://production/": baseUri = "http://APIproduction/"; break;
    case "http://testing/": baseUri = "http://APItesting/"; break;
}
可以将其封装在自己的endpointService中,您可以将其注入您的loginService或任何其他需要它的服务中,如下所示:

(function () {
    angular.module('app').factory('endpointService', function ($location) {
        return {
            getAPIEndpoint: function () {
                var endpoint = '';
                switch ($location.host()) {
                    // test if MVC app is in prod/test/local and determine what API endpoint should be called
                    case 'ProdDomainP.com': endpoint = 'ProdDomainAPIP.com'; break;
                    case 'TestDomainP.com': endpoint = 'TestDomainAPIP.com'; break;
                }
                return endpoint;
            }
        }
    });
})();
这将是一个您注入到其他服务中的服务,以确定您调用的API端点,如下所示:

function loginService($http, $q, endpointService) {

    var baseUri = endpointService.getAPIEndoint();

    var service = {
        login: login,
       ...
    };

    return service;


    function login(user, password) {
        var deferred = $q.defer();
        $http({ method: 'POST', url: baseUri + '/api/tokens',
    ...

我也在努力做到这一点。因此,我不必在angular应用程序中硬编码api端点,在引导angular之前,我使用JavaScript进行服务调用以获取端点。在服务器端(web api),控制器读取web.config以获取angular应用程序将使用的端点,并将其作为JSON返回。然后,在引导angular之前和端点返回JavaScript之后(通过原生js承诺或angular承诺),我设置了一个保存所有端点的全局对象变量。在angular中,有一个端点服务公开这个全局端点对象。最后,当设置端点对象时,我将引导angular应用程序。这样可以确保在角度运行之前设置端点,并尝试使用端点


这很糟糕,需要一个全局端点对象,它存在于angular之外,但这是我能想到的唯一方法,允许使用web.config进行转换,而不必在js中硬编码URL端点

谢谢。这可能是一个可能的解决方案,但我正在尝试的是不使用API调用来获取URI。也许这是不可能的,我需要这样做,但我希望在发布过程中注入,或者类似的东西。我很困惑,这不是使用API调用来确定URI。如果我理解正确,请告诉我。MVC应用程序放在一个域上,Web API放在一个单独的域上。使用MVC应用程序中的angularjs代码,您正在调用Web API,并且基于MVC应用程序所在的位置(生产、测试、本地),您希望调用适当的API端点(生产、测试、本地)?是的,Ben Black,您是对的,MVC应用程序和Web API根据版本具有不同的环境(域)(生产、测试等)。例如,生产中的MVC应用程序将托管在domianP.com上,其API将位于dominapip.com上。此MVC将调用dominapip.com上的端点。所有这些不同的发布都会自动进行。基本上,当TFS发布MVC应用程序时,ng js代码应该将它们放在生产中basicURI=dominapip.com上。我可以执行和AJAX调用我的MVC应用程序并获取域,但我正在尝试避免额外的调用。不幸的是,我不知道如何做到这一点。但是,在使用
$location
服务时,您应该能够告诉您的MVC应用程序所在的环境(生产、测试、本地),然后构造API端点URI,请参阅我的编辑。好的,它会尝试(以冗长的方式)并似乎描述了与公认答案相似的东西。
function loginService($http, $q, endpointService) {

    var baseUri = endpointService.getAPIEndoint();

    var service = {
        login: login,
       ...
    };

    return service;


    function login(user, password) {
        var deferred = $q.defer();
        $http({ method: 'POST', url: baseUri + '/api/tokens',
    ...