2017-03-05 14 views
0

Meine Web-API-2-Anwendung verwendet das Route-Attribut zum Definieren des Routing, aber es scheint nicht so zu funktionieren, wie ich es erwarte: Fehler 405 oder 404 wird vom Backend zurückgegeben. Aktion Methode Die Suche wurde nicht gestartet (es gibt den Haltepunkt innerhalb).Routenattribut funktioniert nicht wie erwartet

Mein Code, Anfrage und Antwort sind folgende:

JS-Code:

var url ='/api/customers/search/', 
var config = { 
       params: { 
        page: 0, 
        pageSize: 4, 
        filter: $scope.filterCustomers 
       } 
      }; 
$http.get(url, config).then(function (result) { 
         success(result); 
        }, function (error) { 
         if (error.status == '401') { 
          notificationService.displayError('Authentication required.'); 
          $rootScope.previousState = $location.path(); 
          $location.path('/login'); 
         } 
         else if (failure != null) { 
          failure(error); 
         } 
        }); 

Code Backend-Controller:

//[Authorize(Roles = "Admin")] 
[RoutePrefix("api/customers")] 
public class CustomersController : ApiControllerBase 
{ 
    private readonly IEntityBaseRepository<Customer> _customersRepository; 

    public CustomersController(IEntityBaseRepository<Customer> customersRepository, 
     IEntityBaseRepository<Error> _errorsRepository, IUnitOfWork _unitOfWork) 
     : base(_errorsRepository, _unitOfWork) 
    { 
     _customersRepository = customersRepository; 
    } 


    //[Route("search/?{page:int=0}&{pageSize=4}")] 
    [Route("search/?{page:int=0}/{pageSize=4}/{filter?}")] 
    [HttpGet] 
    public HttpResponseMessage Search(HttpRequestMessage request, int? page, int? pageSize, string filter = null) 
    { 
     int currentPage = page.Value; 
     int currentPageSize = pageSize.Value; 
... 

Klasse WebApiConfig:

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

      //use authetication handler 
      config.MessageHandlers.Add(new HomeCinemaAuthHandler()); 

      // Enable Route attributes 
      config.MapHttpAttributeRoutes(); 

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

Global. ein sax.css:

public class Global : HttpApplication 
    { 
     void Application_Start(object sender, EventArgs e) 
     { 

      var config = GlobalConfiguration.Configuration; 

      AreaRegistration.RegisterAllAreas(); 

      //Use web api routes 
      WebApiConfig.Register(config); 

      //Autofac, Automapper, ... 
      Bootstrapper.Run(); 

      //Use mvc routes 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 



      //register bundles 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 

      GlobalConfiguration.Configuration.EnsureInitialized(); 

     } 
    } 

Meine Anfrage:

GET http://localhost:65386/api/customers/search/?page=0&pageSize=4 HTTP/1.1 
Accept: application/json, text/plain, */* 
Referer: http://localhost:65386/ 
Accept-Language: pl-PL 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko 
Host: localhost:65386 
Connection: Keep-Alive 

Meine Antwort:

HTTP/1.1 405 Method Not Allowed 
Cache-Control: no-cache 
Pragma: no-cache 
Allow: POST 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/10.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcIXdvcmtcVmlkZW9SZW50YWxcSG9tZUNpbmVtYS5XZWJcYXBpXGN1c3RvbWVyc1xzZWFyY2hc?= 
X-Powered-By: ASP.NET 
Date: Sun, 05 Mar 2017 09:47:27 GMT 
Content-Length: 72 

{"Message":"The requested resource does not support http method 'GET'."} 

=================== ====

Update 1:

Ich änderte JS-Code:

apiService.get('/api/customers/search', config, customersLoadCompleted, customersLoadFailed); 

und Controller:

[HttpGet] 
[Route("search")] 
public HttpResponseMessage Get(HttpRequestMessage request, int? page, int? pageSize, string filter = null) 
{ 

und es funktioniert :).

Aber wenn Controller-Aktion hat:

[HttpGet] 
[Route("search")] 
public HttpResponseMessage Search(HttpRequestMessage request, int? page, int? pageSize, string filter = null) 
{ 
... 

der Fehler immer noch 405 Methode ist Fehler nicht erlaubt. Warum?

Antwort

0

Ich fand die Lösung :) Ich war mein blöder Fehler :). Ich fügte hinzu, falschen Namensraum

using System.Web.Mvc;

statt

using System.Web.Http;

Es funktionierte aber sehr seltsam :).

1

Ihre Anfrage an //localhost:65386/api/customers/search/?page=0&pageSize=4 stimmt nicht mit Ihrer Routenkonfiguration überein.

[Route("search/?{page:int=0}/{pageSize=4}/{filter?}")] definiert 4 route Attribute:

  1. Suche
  2. ?: {? Filter} {Seite int = 0}
  3. {pagesize = 4}

Diese führt zu Ihrem ersten Fehler: Sie mischen Querystrings und Routenkonfiguration. Wenn Sie Querystrings verwenden möchten, verwenden Sie sie einfach. Sie gehören nicht zu den Routenattributen. Dies macht Ihre Routenkonfiguration ungültig.

Sie haben die Wahl zwischen 2 jetzt:

[Route("search/{page:int=0}/{pageSize=4}/{filter?}")] 
//localhost:65386/api/customers/search/0/4/optional-filter-value 

Oder entfernen Sie Ihre Route Datenaufbelichtung und arbeiten mit einfachen Abfrage-Strings auf das Fragezeichen vor dem Seitenattribut entfernen und Ihre GET-Anfrage an

ändern: //localhost:65386/api/customers/search?page=0&pageSize=4&filter=something

+0

Hmm, seltsam, aber immer noch das gleiche Problem ... –

+0

Fast funktioniert, habe ich Update 1 zu meinem Beitrag hinzugefügt. –

0

Grundlagen Warnung! Die System.Web.Http ist für Web-API; Die System.Web.Mvc ist eine für vorherige MVC-Versionen. MVC ist Web-Anwendungen, Web-API ist HTTP-Dienste.

Verwandte Themen