【问题标题】:Why is my .NET web api controller not being found?为什么找不到我的 .NET Web api 控制器?
【发布时间】:2021-08-13 00:10:03
【问题描述】:

我们一直在开发一个 .NET MVC 应用程序,最近正在寻求为电子邮件服务集成一个 webhook。我承认,这是我第一次尝试 webhooks 和 Web API,但它看起来相当简单。我遵循了来自 SendGrid 的几个最佳实践和代码示例,并不断收到“未找到与名为 'xxxxxx' 的控制器匹配的类型”消息。我正在使用 Postman 在本地进行测试,但无法找到控制器。我最初的目标是使用最基本的配置进行测试,然后将 POST 传递给我们的 Web 应用程序,解析数据并返回“ok”。

我已经在 WebApiConfig.cs 中启用了属性路由,测试了多个不同的控制器配置,添加了“GlobalConfiguration.Configure(WebApiConfig.Register);”到我的 Global.asax.cs 文件,并确保我的课程是公开的。

我错过了什么吗?我已经在几天内对这个问题进行了几个小时的故障排除,但一直无法解决。

在我的邮递员请求中,我没有发送任何参数,将内容类型标头设置为 jason,并且仅在正文中包含一个示例 SendGrid 事件。我已经验证了端口号,并且没有通过 http 将任何身份验证传递给我们的本地应用程序。 POST 请求被发送到以下网址:http://localhost:59998/api/sample

我已经关注了几篇关于类似问题的堆栈溢出帖子,并确保我没有自责(私人课程、复数与单数、api 配置设置)。

我的 api 配置:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

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

我删除了大部分操作方法来简化控制器的代码。我现在要做的就是接受 POST,在本地调试,然后返回 ok。我已经尝试了多种不同的类类型,并回溯到最简单的选项。

我在控制器中设置了断点,并且一直在使用多个测试变量进行故障排除,我已将其删除以清理代码(例如:int test = 0)。

namespace StickerAppWeb.Controllers
{
    public class SampleController : ApiController
    {
        [HttpPost]
        public string Index()
        {
            return "API method";
        }

        public void Post()
        {
           //int test = 0; //breakpoint here
        }
    }
}

我的全局配置:

namespace StickerAppWeb
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);


            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

        }
    }
}

更新1: 作为昨天的后续行动,我也将这个项目发布到 Azure,并在向 Azure 中的应用程序提交 POST 时从 Postman 得到相同的响应。是否有任何原因导致应用程序在本地和 Azure 中都找不到该控制器?

【问题讨论】:

  • 也许我完全错了,但您的路线模板缺少操作。这很可疑,因为它(可能)意味着采取了默认操作(索引)。但是您的默认操作是 POST 而不是 GET。我建议回到基础——放弃你的自定义路线,使用 GET 索引并测试它。如果它可以工作,那确实是问题,如果没有,你的代码还有另一个问题。

标签: c# .net controller webapi


【解决方案1】:

您的代码没有问题,应该可以工作。要向 api 发送 post 请求,您可以按照下面的代码。

public string MYMethod()
{
   string str= Task.Run(() => GetFromWeb).Result;
   return str;
}

如果你想使用post方法

private async Task<string> GetFromWeb()
{
    HttpClient client = new HttpClient();
    string Resturl =  "domainname/api/sample/Index";

    var response = await client.PostAsync(Resturl, null);
    var result = await response.Content.ReadAsStringAsync();
    return result;
}

如果你想使用get方法

private async Task<string> GetFromWeb()
{
   var client = new HttpClient();
   var result = await client.GetAsync("domainname/api/sample/Index");
   var response = await result.Content.ReadAsStringAsync();
   return response;
}

【讨论】:

  • Asdi,谢谢你,我会根据你提供的代码查询我们的 webhook,并会尽快回复。
  • 用get方法在本地测试,然后切换到post。网址可能有问题。
  • 我设置了您推荐的内容,但在向 localhost 和 Azure Web 应用程序发送 GET 或 POST 时仍然收到相同的消息。响应值:response {StatusCode: 404, ReasonPhrase: 'Not Found', Version: 1.1, Content: System.Net.Http.StreamContent, 结果值: "{\"Message\":\"没有找到HTTP资源匹配请求 URI 'localhost:59998/api/sample/index'.\",\"MessageDetail\":\"未找到与名为 'sample' 的控制器匹配的类型。\"}" 字符串
  • 似乎其他人都能让这个基本配置工作,但当它变得更复杂时就会停止。我需要在应用程序中公开其他任何内容或需要打开以启动 APIcontroller 的配置吗?有没有其他方法可以确认或验证 SampleController 应该正在运行并接受输入(除了 api 配置)?
  • 逻辑上应该可以的,不知道问题出在哪里。
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多