Skip to main content
 首页 » 编程设计

c#之WebApi 端点总是给出 "404 not found"

2024年02月27日33think

我正在尝试在一个全新的网络应用程序中实现 WebApi 端点,但无论我尝试什么,在尝试从所述端点执行 GET 时,我总是得到“404 not found”。

我从简单开始,只是尝试从数据库中提取车辆列表。

我的应用程序的目录结构如下所示:

相关代码如下所示:

dataService.js

(function () { 
 
var injectParams = ['vehiclesService']; 
 
var dataService = function (vehiclesService) { 
    return vehiclesService; 
}; 
 
dataService.$inject = injectParams; 
 
angular.module('teleAiDiagnostics').factory('dataService', dataService); 
}()); 

vehiclesService.js

(function () { 
 
var injectParams = ['$http', '$q']; 
 
var vehiclesFactory = function ($http, $q) { 
    var serviceBase = '/api/dataservice/', 
        factory = {}; 
 
    factory.getVehicles = function () { 
        return $http.get(serviceBase + 'vehicles').then(function (response) { 
            var vehicles = response.data; 
            return { 
                totalRecords: parseInt(response.headers('X-InlineCount')), 
                results: vehicles 
            }; 
        }); 
    }; 
 
    return factory; 
}; 
 
vehiclesFactory.$inject = injectParams; 
 
angular.module('teleAiDiagnostics').factory('vehiclesService', vehiclesFactory); 
}()); 

DataServiceController.cs

using System.Collections.Generic; 
using System.Net; 
using System.Net.Http; 
using System.Web; 
using System.Web.Http; 
 
namespace TeleAiDiagnostics 
{ 
    public class DataServiceController : ApiController 
    { 
        TeleAiRepository _TeleAiRepository; 
 
        public DataServiceController() 
        { 
            _TeleAiRepository = new TeleAiRepository(); 
        } 
 
        [HttpGet] 
        public HttpResponseMessage Vehicles() 
        { 
            List<TeleAiVehicle> vehicles = _TeleAiRepository.GetVehicles(); 
            HttpContext.Current.Response.Headers.Add("X-inlineCount", vehicles.Count.ToString()); 
            return Request.CreateResponse(HttpStatusCode.OK, vehicles); 
        } 
    } 
} 

vehiclesController.js

(function () { 
    var injectParams = ['$location', 'dataService']; 
 
    var VehiclesController = function ($location, dataService) { 
        var vm = this; 
 
        vm.vehicles = []; 
 
        function init() { 
            dataService.getVehicles() 
                .then(function (data) { 
                    vm.vehicles = data.results; 
                }, function (error) { 
                    var thisError = error.data.message; 
                }); 
        }; 
 
        init(); 
    }; 
 
    VehiclesController.$inject = injectParams; 
 
    angular.module('teleAiDiagnostics').controller('VehiclesController', VehiclesController); 
}()); 

WebApiConfig.cs

using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 
using System.Linq; 
using System.Web.Http; 
using System.Web.Routing; 
 
namespace TeleAiDiagnostics 
{ 
    public static class WebApiConfig 
    { 
        public static void Register(HttpConfiguration config) 
        { 
 
            config.MapHttpAttributeRoutes(); 
 
            config.Routes.MapHttpRoute( 
                name: "DefaultApi", 
                routeTemplate: "api/{controller}/{action}/{id}", 
                defaults: new { id = RouteParameter.Optional } 
            ); 
 
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
 
            // Remove default XML handler 
            var matches = config.Formatters 
                                .Where(f => f.SupportedMediaTypes 
                                             .Where(m => m.MediaType.ToString() == "application/xml" || 
                                                         m.MediaType.ToString() == "text/xml") 
                                             .Count() > 0) 
                                .ToList(); 
 
            foreach (var match in matches) 
                config.Formatters.Remove(match); 
        } 
    } 
} 

Global.asax.cs

using System; 
using System.Web.Http; 
 
namespace TeleAiDiagnostics 
{ 
    public class Global : System.Web.HttpApplication 
    { 
 
        protected void Application_Start(object sender, EventArgs e) 
        { 
            WebApiConfig.Register(GlobalConfiguration.Configuration); 
            GlobalConfiguration.Configuration.EnsureInitialized(); 
        } 
 
        protected void Session_Start(object sender, EventArgs e) 
        { 
 
        } 
 
        protected void Application_BeginRequest(object sender, EventArgs e) 
        { 
 
        } 
 
        protected void Application_AuthenticateRequest(object sender, EventArgs e) 
        { 
 
        } 
 
        protected void Application_Error(object sender, EventArgs e) 
        { 
 
        } 
 
        protected void Session_End(object sender, EventArgs e) 
        { 
 
        } 
 
        protected void Application_End(object sender, EventArgs e) 
        { 
 
        } 
    } 
} 

RouteConfig.cs

namespace TeleAiDiagnostics 
{ 
    public class RouteConfig 
    { 
    } 
} 

我已经尝试了几乎所有可以在网上找到的教程中的说明,但我仍然没有任何运气。

非常感谢可以提供的任何帮助。

谢谢,

伊恩

请您参考如下方法:

我认为您只是缺少端口号。当您在 Visual Studio 中启动 WebApi 项目时,WebApi 可能会托管在 IISExpress 中。在属性页面上,您将在 WEB 选项卡中找到地址和端口:

您必须将端口号添加到 Angular 代码中的地址

例如:http://localhost:46452/api/dataservice/vehicles