C# WebApi端点始终给出“404未找到”

C# WebApi端点始终给出“404未找到”,c#,asp.net,angularjs,asp.net-web-api,C#,Asp.net,Angularjs,Asp.net Web Api,我正在尝试在一个全新的web应用程序中实现WebApi端点,但无论我尝试了什么,当我尝试从所述端点执行get时,总是找不到404 我从简单开始,只是尝试从数据库中提取车辆列表 我的应用程序的目录结构如下所示: 相关的代码位如下所示: dataService.js VehicleService.js DataServiceController.cs WebApiConfig.cs Global.asax.cs RouteConfig.cs 我在网上找到的每一个教程中都试过了,但我还是没有任何运气

我正在尝试在一个全新的web应用程序中实现WebApi端点,但无论我尝试了什么,当我尝试从所述端点执行get时,总是找不到404

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

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

相关的代码位如下所示:

dataService.js

VehicleService.js

DataServiceController.cs

WebApiConfig.cs

Global.asax.cs

RouteConfig.cs

我在网上找到的每一个教程中都试过了,但我还是没有任何运气

我们非常感谢能提供的任何帮助

谢谢


Ian

这可能是因为您默认的Web API路由。我认为应该是:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

如果没有{action}部分

,可能是因为默认的Web API路由。我认为应该是:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

如果没有{action}部分

我想您只是缺少端口号。当您在VisualStudio中启动WebApi项目时,WebApi可能由IISExpress中的主机托管。在“属性”页上,您将在“WEB”选项卡中找到地址和端口:

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


例如:

我想你只是错过了端口号。当您在VisualStudio中启动WebApi项目时,WebApi可能由IISExpress中的主机托管。在“属性”页上,您将在“WEB”选项卡中找到地址和端口:

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

我们有答案了

丹·杜米特鲁和JP都是正确的。在尝试IIS Express之后,我意识到了我的错误

终点确实是http://localhost/TeleAiDiagnostics/api/dataservice/vehicles 不仅仅是http://localhost/api/dataservice/vehicles.

不知道为什么我花了这么长时间才意识到这一点。无论如何,我要感谢大家的帮助。

我们有答案了

丹·杜米特鲁和JP都是正确的。在尝试IIS Express之后,我意识到了我的错误

终点确实是http://localhost/TeleAiDiagnostics/api/dataservice/vehicles 不仅仅是http://localhost/api/dataservice/vehicles.


不知道为什么我花了这么长时间才意识到这一点。无论如何,我要感谢大家的帮助。

您是否尝试在API控制器上声明RoutePrefix属性?我尝试将[RoutePrefixdataservice]添加到DataServiceController.cs,但没有帮助。我还尝试添加[RoutePrefixdataservice/vehicles]但无效。您是否尝试在API控制器上声明RoutePrefix属性?我尝试将[RoutePrefixdataservice]添加到DataServiceController.cs,但没有帮助。我还尝试添加[RoutePrefixdataservice/vehicles]但没有效果。我将其更改为:config.Routes.MapHttpRoute名称:DefaultApi,routeTemplate:api/{controller}/{id},默认值:new{id=RouteParameter.Optional};还是没有骰子。我也厌倦了修改VehicleService.js来删除dataservice部分,但它仍然不起作用。@Ian-如果你只是从浏览器转到http://localhost/api/dataservice,你还有404吗?我还有404。同样的事情http://localhost/api/dataservice/vehicles 和http://localhost/api/vehicles.@伊恩-看来你的Web API路由有问题。你可以创建一个新的简单的WebAPI项目,看看默认路由是否有效,然后从那里开始构建。我会解决这个问题,找到解决方案后再签入。我将其更改为:config.Routes.maphttprote name:DefaultApi,routeTemplate:api/{controller}/{id},默认值:new{id=RouteParameter.Optional};还是没有骰子。我也厌倦了修改VehicleService.js来删除dataservice部分,但它仍然不起作用。@Ian-如果你只是从浏览器转到http://localhost/api/dataservice,你还有404吗?我还有404。同样的事情http://localhost/api/dataservice/vehicles 和http://localhost/api/vehicles.@伊恩-看来你的Web API路由有问题。你可以创建一个新的简单的WebAPI项目,看看默认路由是否有效,然后从那里开始构建。我会解决这个问题,找到解决方案后再回来检查。我已经想到了。我使用本地IIS作为我的web服务器,因此没有端口号@伊恩-也许URL应该是http://localhost/TeleAiDiagnostics/api/dataservice?@伊恩:没有港口号码吗?可能吗?最好再检查一遍,我想你的服务会监听一些端口号。或者重新配置为使用如上所示的IIS Express,并尝试使用端口号。我已经想到了这一点。我使用本地IIS作为我的web服务器,因此没有端口号@伊恩-梅
那么URL应该是http://localhost/TeleAiDiagnostics/api/dataservice?@伊恩:没有港口号码吗?可能吗?最好再检查一遍,我想你的服务会监听一些端口号。或者重新配置为使用如上所示的IIS Express,并尝试使用端口号。谢谢,但在回家的路上重新考虑后,我认为我对端口的想法是错误的,因为使用错误的端口号会得到不同的错误50x?因为客户端无法访问任何服务。无论如何,很高兴听到它被解决了:。谢谢,但在回家的路上重新考虑后,我认为我对端口的想法是错误的,因为如果端口号错误,你会得到不同的错误50x?因为客户端无法访问任何服务。不管怎样,很高兴听到问题解决了:。
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);
        }
    }
}
(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);
}());
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);
        }
    }
}
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)
        {

        }
    }
}
namespace TeleAiDiagnostics
{
    public class RouteConfig
    {
    }
}
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);