繁体   English   中英

“长”路由不适用于WebAPI

[英]“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM