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?
Hmm, seltsam, aber immer noch das gleiche Problem ... –
Fast funktioniert, habe ich Update 1 zu meinem Beitrag hinzugefügt. –