0

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

    [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 类初始化如下:

    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
    {
      ...
    }

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

我不确定这里出了什么问题,任何帮助将不胜感激。

4

2 回答 2

0

您的RemoteController会抛出异常,因为您不遵循 WEB API 的命名约定。作为 get 方法的RemoteHost()方法必须具有“Get”前缀,因此它的名称实际上应该是GetRemoteHost()。那应该解决它。

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

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

希望有帮助。

于 2019-05-16T18:48:05.840 回答
0

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

抱歉打扰了...

于 2019-05-21T06:22:10.650 回答