连接到 WebAPI2 端点(路由)为控制器抛出 Http 代码 503,另一个控制器工作正常

Connecting to WebAPI2 endpoints(routes) throw Http code 503 for a controller and another controller works fine

我正在使用带有 WebAPI2 的 Owin 自托管。 我有两个控制器 classes 并使用属性路由。 其中之一具有以下签名:

    [RoutePrefix("api/v1/devices")]
    public class DeviceController : ApiController
    {

        [HttpPost]
        [Route("")]
        public async Task<HttpResponseMessage> DevicePresence()
        {
           ...
        }

        [HttpGet]
        [Route("updates/{deviceID}")]
        public HttpResponseMessage GetDeviceUpdates(string deviceID)
        {
            ...
        }
    }

这个工作正常并且触发了操作方法。

另一个控制器具有以下签名:

    [RoutePrefix("device/class")]
    public class RemoteController : ApiController
    {
        [HttpGet]
        [Route("remotehost")]
        public HttpResponseMessage RemoteHost()
        {
            ...
        }

        [HttpGet]
        [Route("version")]
        public HttpResponseMessage GetVersion()
        {
            ...
        }
     }

当我尝试连接到其中任何一个时,我收到 503(服务不可用)响应。

我的 Startup class 初始化如下:

    public class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.Formatters.Add(new JsonMediaTypeFormatter());
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
    }

我也试过用常规路由,还是一样的问题

config.Routes.MapHttpRoute(
                name: "RemoteApi",
                routeTemplate: "device/{controller}/{action}"
            );

public class ClassController : ApiController
{
       public HttpResponseMessage GetVersion()
        {
            ...
        }
}

这也是抛出503状态码 如果我如下更改第二个控制器中的 Route 前缀,那么它正在工作:

[RoutePrefix("api/v1/device/class")]
    public class RemoteController : ApiController
    {
      ...
    }

根据我的要求,我无法更改端点。

我不确定这里有什么问题,我们将不胜感激。

您的 RemoteController 抛出异常,因为您不遵循 WEB API 的命名约定。 你的 RemoteHost() 方法是一个 get 方法,必须有一个 "Get" 前缀,所以它的名字实际上应该是 GetRemoteHost(). 那应该解决它。

如果您想更改命名约定,可以修改 global.asax 文件中的路由定义:

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

希望对您有所帮助。

我意识到这不是 webapi 或路由的问题。 实际上,我正在为 URL 添加一个防火墙例外,并且不知何故它没有从防火墙设置中删除并在 DACL 中保留一个条目。 我从 cmd 提示符中删除了它,现在一切正常。

抱歉打扰...