首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到api的路由工作错误

到api的路由工作错误
EN

Stack Overflow用户
提问于 2016-07-18 20:00:43
回答 2查看 64关注 0票数 0

当我从api/FileBrowser,发出请求时,它会很好地发送到/Home/api/FileBrowser,但是当我尝试从http://localhost:5086/Home/Index向api发出请求时,向url添加的控制器主页和请求发送到/Home/api/FileBrowser

请帮帮我做错了什么?

两种方法的ApiController

代码语言:javascript
复制
public FileBrowserModel Get()
    {
        var result = new FileBrowserModel();
        List<string> drives = new List<string>();
        foreach (var drive in DriveInfo.GetDrives())
        {
            var path = drive.Name;
            FileManagerCounter fmCounter = new FileManagerCounter(path);
            result.CountTo10Mb += fmCounter.CountTo10Mb;
            result.Countfrom10To50Mb += fmCounter.Countfrom10To50Mb;
            result.CountFrom100Mb += fmCounter.CountFrom100Mb;
            drives.Add(path);
        }
        result.SubDirectories = new List<string>(drives);
        return result;
    }
    [CacheOutput(ServerTimeSpan = 150)]
    [System.Web.Http.HttpGet]
    public FileBrowserModel Get(string path)
    {
        var result = new FileBrowserModel();

        try
        {
            try
            {
                result.ParentPath  = Directory.GetParent(path).FullName;
            }
            catch (Exception)
            {

            }

            var files = Directory.GetFiles(path).ToList();
            result.Files = new List<string>(files);
            result.CurrentPath = path;
            FileManagerCounter fmCounter = new FileManagerCounter(path);
            result.CountTo10Mb = fmCounter.CountTo10Mb;
            result.Countfrom10To50Mb = fmCounter.Countfrom10To50Mb;
            result.CountFrom100Mb = fmCounter.CountFrom100Mb;

            var subDirectories = Directory.GetDirectories(path).ToList();
            result.SubDirectories = new List<string>(subDirectories);
        }
        catch (Exception ex)
        {
            throw new HttpResponseException(HttpStatusCode.InternalServerError);
        }

        return result;
    }

js文件

代码语言:javascript
复制
angular.module("FileBrowserApp", [])
.controller("fileBrowserController", function($scope, $http) {
    $scope.getFileBrowsing = function (path) {
        $scope.isLoading = true;
        if (path != null) {
            $http({
                url: "api/FileBrowser?path=" + encodeURIComponent(path),
                method: "GET"
            }).success(function (data) {
                $scope.fileBrowserModel = data;
                $scope.isLoading = false;
            });
        } else {
            $http({
                url: "api/FileBrowser",
                method: "GET"
            }).success(function (data) {
                $scope.fileBrowserModel = data;
                $scope.isLoading = false;
            });
        }
    };
    $scope.getFileBrowsing();
});    

路线

代码语言:javascript
复制
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{path}",
            defaults: new { path = RouteParameter.Optional }
        );
    }
}
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-18 20:17:01

如果您完全确定Web API层总是存在于根域之上的一个层,那么您可以将ajax调用中的urls更改为:

代码语言:javascript
复制
url: "/api/..."

这会调用相对于根域的api,而不管站点的结构如何。

票数 2
EN

Stack Overflow用户

发布于 2016-07-18 20:07:16

编辑:War10ck的答案是简单的解决方案。

下面是一个替代解决方案,它正确地构建了相对url

问题是,您将url值硬编码为"api/FileBrowser“。因此,基于当前页面,这个值将指向主页上的change.If,它将是Home/api/FileBrowser

您应该做的是构建正确的相对url。由于您使用的是asp.net mvc页面,所以您可以利用Url.Action帮助方法的优势来构建正确的相对url。您可以在剃须刀视图中生成应用程序路由的值,并将其传递给您的角度控制器/数据服务并使用它。

所以在你的剃须刀上,

代码语言:javascript
复制
<script>
    var myApp = myApp || {};
    myApp.Urls = myApp.Urls || {};
    myApp.Urls.baseUrl = '@Url.Content("~")';       
</script>
<script src="~/Scripts/AngularControllerForPage.js"></script>
<script>
    var a = angular.module("FileBrowserApp").value("appSettings", myApp);
</script>

在你的角度控制器中,你可以访问这个appSettings。

代码语言:javascript
复制
var app = angular.module("FileBrowserApp", []);
var ctrl = function (appSettings) {

    var vm = this;

    vm.baseUrl = appSettings.Urls.baseUrl;
    //build other urls using the base url now
    var fileBrowserUrl= vm.baseUrl + "api/FileBrowser";
    alert(fileBrowserUrl);
    //You can use this variable value for your http call now
    $http({
            url: fileBrowserUrl+ "?path=" + encodeURIComponent(path),
            method: "GET"
        }).success(function (data) {
            $scope.fileBrowserModel = data;
            $scope.isLoading = false;
        });

};
app.controller("fileBrowserController", ctrl)

您可以和在您的数据服务和指令等中访问它,并使用它来构建正确的url。

您还可以考虑将http调用从角度控制器转移到数据服务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38445062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档