2015-05-08 3 views
0

Я разрабатываю ASP.NET Web Api с C# и .NET Framework 4.5.1.На контроллере не найдено никаких действий

У меня странное поведение. Я могу получить доступ к двум следующим маршрутам, но я не могу добраться до третьего и четвертого. Я получаю ошибку:

No HTTP resource was found that matches the request URI. No action was found in the 'ExternalCodes' driver match the application.

[HttpPut] 
[Route("api/ExternalCodes/SetCodesAsUsed")] 
public HttpResponseMessage SetCodesAsUsed(List<string> codes) 
{ 
    return ChangeCodesStatus(codes, 3); 
} 

[HttpPut] 
[Route("api/ExternalCodes/SetCodesAsUnUsed")] 
public HttpResponseMessage SetCodesAsUnUsed(List<string> codes) 
{ 
    return ChangeCodesStatus(codes, 1); 
} 

[HttpPut] 
[Route("api/ExternalCodes/SetBatchCodesAsUsed")] 
public HttpResponseMessage SetBatchCodesAsUsed(int batchId) 
{ 
    return ChangeBatchCodesStatus(batchId, 3); 
} 

[HttpPut] 
[Route("api/ExternalCodes/SetBatchCodesAsUnUsed")] 
public HttpResponseMessage SetBatchCodesAsUnUsed(int batchId) 
{ 
    return ChangeBatchCodesStatus(batchId, 1); 
} 

Все в одном классе.

Это мой WebApiConfig класс:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

     config.Routes.MapHttpRoute(
      name: "ProductionOrderActionApi", 
      routeTemplate: "api/ProductionOrders/{action}/{orderNumber}", 
      defaults: new { controller = "ProductionOrders", orderNumber = RouteParameter.Optional }); 

     config.Routes.MapHttpRoute(
      name: "BatchesActionApi", 
      routeTemplate: "api/Batches/{action}", 
      defaults: new { controller = "Batches" }); 

     config.Routes.MapHttpRoute(
      name: "LinesActionApi", 
      routeTemplate: "api/Lines/{action}", 
      defaults: new { controller = "Lines" }); 

     config.Routes.MapHttpRoute(
      name: "ExternalCodesActionApi", 
      routeTemplate: "api/ExternalCodes", 
      defaults: new { controller = "ExternalCodes" }); 

     config.Routes.MapHttpRoute(
      name: "CodesActionApi", 
      routeTemplate: "api/Codes", 
      defaults: new { controller = "Codes" }); 

     config.Routes.MapHttpRoute(
      name: "AggregationsActionApi", 
      routeTemplate: "api/Aggregations", 
      defaults: new { controller = "Aggregations" }); 
    } 
} 

Это мои NuGet пакеты:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Antlr" version="3.5.0.2" targetFramework="net451" /> 
    <package id="bootstrap" version="3.3.2" targetFramework="net451" /> 
    <package id="DotNetZip" version="1.9.3" targetFramework="net451" /> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net451" /> 
    <package id="jQuery" version="2.1.3" targetFramework="net451" /> 
    <package id="jQuery.Validation" version="1.13.1" targetFramework="net451" /> 
    <package id="log4net" version="2.0.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Client.es" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.Core.es" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost.es" version="5.2.3" targetFramework="net451" /> 
    <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net451" /> 
    <package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.3" targetFramework="net451" /> 
    <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net451" /> 
    <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net451" /> 
    <package id="Modernizr" version="2.8.3" targetFramework="net451" /> 
    <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net451" /> 
    <package id="Ninject" version="3.2.2.0" targetFramework="net451" /> 
    <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net451" /> 
    <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net451" /> 
    <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net451" /> 
    <package id="WebActivatorEx" version="2.0.6" targetFramework="net451" /> 
    <package id="WebGrease" version="1.6.0" targetFramework="net451" /> 
</packages> 

Это очень странно, потому что все маршруты в одном контроллере.

Любая идея, что происходит?

ссылки для доступа действий являются:

http://mySpecialServer:53827/api/ExternalCodes/SetBatchCodesAsUsed 
http://mySpecialServer:53827/api/ExternalCodes/SetCodesAsUsed 
+0

Можете ли вы предоставить ссылки вы пытаетесь использовать для доступа к действиям? – Kamo

+0

Вопрос обновлен. – VansFannel

+0

С '/ setBatchCodesAsUsed' вы пытаетесь получить доступ к методу, который не реализован. Вы должны называть его идентификатором типа '/ SetBatchCodesAsUsed/{ID}'. – greenhoorn

ответ

2

Вы обращаетесь действия на контроллер без параметра.

В вашем запросе параметр codes имеет значение null. Это работает, потому что List<string> -datatype с нулевым значением.

[HttpPut] 
[Route("api/ExternalCodes/SetCodesAsUsed")] 
public HttpResponseMessage SetCodesAsUsed(List<string> codes) 
{ 
    return ChangeCodesStatus(codes, 3); 
} 

Второе звено делает то же самое ->batchId равна нулю. Но int является не-nullable, поэтому вы получите сообщение об ошибке.

В любом случае вы должны изменить маршрут, если у вас есть параметры (особенно если они не могут быть обнулены).

[Route("api/ExternalCodes/SetBatchCodesAsUnUsed/{batchId}")]

Этот маршрут идентификатор, как часть вашего звонка. Это имеет то преимущество, что вы всегда знаете, какой ресурс вы меняете.

вызов будет выглядеть следующим образом:

http://mySpecialServer:53827/api/ExternalCodes/SetBatchCodesAsUsed/1

+0

Я не знаю, понял ли я ваш ответ, но если я делаю 'http: // mySpecialServer: 53827/api/ExternalCodes/SetBatchCodesAsUsed/111', я получаю HTTP CODE 404 (Not FOUND). – VansFannel

+0

Вы отправляете запрос HTTP PUT? – Kamo

+0

Возможно, вы отправляете запрос GET. Как вы отправляете запрос? Через html-форму? Кнопка? – greenhoorn

Смежные вопросы