使用Web Api的Mvc - 未找到与命名的控制器匹配的类型

时间:2016-10-12 17:58:07

标签: c# asp.net asp.net-mvc asp.net-web-api

我正在尝试使用web api向我的mvc项目添加Web服务。 项目创建后,我选择了Mvc + Web Api。

但是,我无法访问api控制器,我不断收到此错误:

<Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://www.myapp.app/api/sms'.
    </Message>
    <MessageDetail>
        No type was found that matches the controller named 'sms'.
    </MessageDetail>
</Error>

我的global.asax

AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
BundleMobileConfig.RegisterBundles(BundleTable.Bundles);

我的RouteConfig.cs

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 }
    );
}

我的WebApiConfig.cs

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();

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

}

我的Api控制器:

public class SmsController : ApiController
{
    private DbContext db = new DbContext();

    // GET: api/Sms
    public IQueryable<Sms> GetSms()
    {
        return db.Sms;
    }
    ...
}

当然,我正试图通过http://www.myapp.app/api/sms访问api。

我真的尝试了我能想到的一切,并在SO和其他论坛上阅读了所有相关问题,但没有任何帮助。 我很确定它与我的应用程序网址有关,这不是常规localhost:port,我将其更改为www.myapp.app并且它在端口80上运行。

为此,我必须将IIS绑定更改为*:80:www.myapp.app,并将此条目添加到drivers/etc/hosts文件中:127.0.0.1 www.myapp.app

此时我很确定这是造成我问题的原因。

有什么想法吗?

Application Insights表示我的请求显然已正确映射:

Application Insights saying there were request attempts

此外,它还显示以下请求已映射到此控制器和操作:

获取短信
获取短信/ GetSms
获取短信/获取信息 获取短信/索引
获取短信 GET / api / sms

1 个答案:

答案 0 :(得分:0)

使用属性路由

public class SmsController : ApiController
{
    private DbContext db = new DbContext();

    // GET: api/Sms
    [HttpGet]
    [Route("api/sms")]
    public IQueryable<Sms> GetSms()
    {
        return db.Sms;
    }
    ...
}

如果端口号为80,则无需添加,但如果与80不同,则为url

http://www.myapp.app:portnumber/api/sms