[英]“Long” routing doesn't work with WebAPI
我在WebAPI应用程序中路由比较长
[HttpPost]
[Route("api/machines/{machineId}/measurements/scopes")]
public IHttpActionResult SaveScopeForMachine(int machineId, [FromBody]ScopeViewModel scopeVM, int? userId, int? locationId)
{
当我尝试发布数据时,我总是得到404
。 要发布数据,我使用MATLAB
options = weboptions('MediaType','application/json', 'RequestMethod', 'post');
webwrite('http://localhost:62284/api/machines/1/measurements/scopes', data, options)
另一种Post方法可以正常工作,例如这种方法
[HttpPost]
[Route("api/systems/{id}/machine/")]
public IHttpActionResult AddMachineFromSystem(int id, [FromBody]MachineViewModel machineVM)
即使我在这里尝试这个也可以
[HttpPost]
[Route("api/mytest")]
public IHttpActionResult mytest([FromBody]ScopeViewModel svm)
{
SaveScopeForMachine(1, svm, null, null);
return Ok();
}
附加信息:我同时拥有webapi和mvc
我在webapi中的路由(可能太重载了?)
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApiOverview",
routeTemplate: "api/{controller}/",
defaults: null
);
config.Routes.MapHttpRoute(
name: "DefaultApiWithoutId",
routeTemplate: "api/{controller}/{action}/",
defaults: null
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
}
我的应用程序从global.asax开始(因此,我首先定义了webapiconfig)
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
在没有看到更多代码的情况下,我认为您可能假设参数是可选的,但它们可以为nullable
。
尝试这个
[HttpPost]
[Route("api/machines/{machineId}/measurements/scopes")]
public IHttpActionResult SaveScopeForMachine(int machineId, [FromBody]ScopeViewModel scopeVM, int? userId = null, int? locationId = null)
您以前的路线仍将要求它们出现,这样可以为它们提供一个值,因此可以将其省略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.