连接到 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 提示符中删除了它,现在一切正常。
抱歉打扰...
我正在使用带有 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 提示符中删除了它,现在一切正常。
抱歉打扰...