Próbowałem implementacji @Intrepid i napotkałem pewne problemy. Widzę dwa rozwiązania tutaj:
Rozwiązanie 1: Część: return Forbidden();
nie powinna działać.
Kompilator nie rozpoznałby tego.
Zamiast tego powinno być: return new ForbiddenResult(Request, "my reason");
UPDATE 1
Rozwiązanie 2:
Myślę, że to co @Interpid przeznaczone na jego realizację, ale brakowało kilku rzeczy .
Aby korzystać return Forbidden();
CommonApiController
powinny być aktualizowane z funkcjami, które zwracają zwyczaj IHttpActionResult
dla Forbidden
i NoContent
Klasa powinna wyglądać następująco:
public abstract class CommonApiController: ApiController {
protected ForbiddenResult Forbidden() {
return new ForbiddenResult(this.Request);
}
protected ForbiddenResult Forbidden(string reason) {
return new ForbiddenResult(this.Request, reason);
}
protected NoContentResult NoContent() {
return new NoContentResult(this.Request);
}
protected NoContentResult NoContent(string reason) {
return new NoContentResult(this.Request, reason);
}
public class ForbiddenResult: IHttpActionResult {
private readonly HttpRequestMessage _request;
private readonly string _reason;
public ForbiddenResult(HttpRequestMessage request, string reason) {
_request = request;
_reason = reason;
}
public ForbiddenResult(HttpRequestMessage request) {
_request = request;
_reason = "Forbidden";
}
public Task <HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
var response = _request.CreateResponse(HttpStatusCode.Forbidden, _reason);
return Task.FromResult(response);
}
}
public class NoContentResult: IHttpActionResult {
private readonly HttpRequestMessage _request;
private readonly string _reason;
public NoContentResult(HttpRequestMessage request, string reason) {
_request = request;
_reason = reason;
}
public NoContentResult(HttpRequestMessage request) {
_request = request;
_reason = "No Content";
}
public Task <HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
var response = _request.CreateResponse(HttpStatusCode.NoContent, _reason);
return Task.FromResult(response);
}
}
}
W każdym razie, jeśli jestem źle i odpowiedź @ Interpid jest poprawna. Czego mi tu brakuje, aby jego implementacja działała?
Nieautoryzowane = 401. Forbidden = 403. –
Fajnie, to najlepsza odpowiedź. –
W niektórych przypadkach zwrócenie 'void' nie jest opcją, ponieważ chcesz odpowiedzieć BadRequest lub innym kodem statusu w procesie sprawdzania poprawności tylko wyślij NoContent na sukces. Zwrócenie 'StatusCode (HttpStatusCode.NoContent)' rozwiązało to dla mnie i jest o wiele czystszym rozwiązaniem niż zaakceptowana odpowiedź. – Nemo1024