Grąžinkite turinį naudodami IHttpActionResult, kad neatsakytų atsakymas

Jei norite grįžti iš „Web API 2“ valdiklio, turinį galiu grąžinti su atsakymu, jei atsakymas yra tvarkingas (200 būsena) atrodo taip:

  public IHttpActionResult Get() { string myResult = ... return Ok(myResult); } 

Jei įmanoma, noriu, jei įmanoma, naudoti integruotus rezultatų tipus: https://msdn.microsoft.com/en-us/library/system.web.http.results(v=vs.118).aspx

Mano klausimas yra toks, kad kitam atsakymo tipui (ne 200), kaip galiu grąžinti jam pranešimą (eilutę)? Pavyzdžiui, galiu tai padaryti:

  public IHttpActionResult Get() { return InternalServerError(); } 

bet ne tai:

  public IHttpActionResult Get() { return InternalServerError("Message describing the error here"); } 

Idealiu atveju aš noriu, kad tai būtų apibendrinta, kad galėčiau išsiųsti pranešimą iš bet kurio „IHttpActionResult“ įgyvendinimo.

Turiu tai padaryti (ir sukurti savo atsakymo pranešimą):

  public IHttpActionResult Get() { HttpResponseMessage responseMessage = ... return ResponseMessage(responseMessage); } 

ar yra geresnis būdas?

141
18 февр. gegužės 18 d 2015-02-18 19:29 '15, 19:29, 2015-02-18 19:29
@ 16 atsakymų

Galiausiai nusprendžiau naudoti šį sprendimą:

 public class HttpActionResult : IHttpActionResult { private readonly string _message; private readonly HttpStatusCode _statusCode; public HttpActionResult(HttpStatusCode statusCode, string message) { _statusCode = statusCode; _message = message; } public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { HttpResponseMessage response = new HttpResponseMessage(_statusCode) { Content = new StringContent(_message) }; return Task.FromResult(response); } } 

... kurią galima naudoti taip:

 public IHttpActionResult Get() { return new HttpActionResult(HttpStatusCode.InternalServerError, "error message"); // can use any HTTP status code } 

Esu atviras pasiūlymams tobulinti. :)

25
18 февр. atsakymas mayabelle 18 vas . 2015-02-18 19:59 '15 19:59 2015-02-18 19:59

Galite naudoti:

 return Content(HttpStatusCode.BadRequest, "Any object"); 
349
10 окт. spalio 10 d. Shamil Yakupov atsakymas . 2015-10-10 15:05 '15, 15:05 2015-10-10 15:05

Galite naudoti „ HttpRequestMessagesExtensions.CreateErrorResponse“ („ System.Net.Http vardų erdvę ), pavyzdžiui:

 public IHttpActionResult Get() { return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Message describing the error here")); } 

Norint pasinaudoti žiniatinklio API turinio nuoseklumu, pageidautina sukurti atsakymus pagal užklausą.

46
18 февр. atsakymą pateikė vartotojo1620220 18 vas . 2015-02-18 19:38 '15, 19:38, 2015-02-18 19:38

Taip pat galite:

 return InternalServerError(new Exception("SOME CUSTOM MESSAGE")); 
14
14 мая '15 в 16:22 2015-05-14 16:22 atsakymas pateikiamas ilans gegužės 14 d., 15 d., 4:22, 2015-05-14 16:22

Kiekvienas, kuris nori grįžti į bet kurį būsenos kodą su atsakymo pranešimu:

 //CreateResponse(HttpStatusCode, T value) return ResponseMessage(Request.CreateResponse(HttpStatusCode.XX, object)); 
7
06 дек. Atsakymą pateikė CularBytes 06 gruodis 2015-12-06 17:17 '15, 17:17, 2015-12-06 17:17

„ASP.NET“ žiniatinklio API 2 galite uždėti bet kokį ResponseMessage į atsakymą „ResponseMessageResult“ :

 public IHttpActionResult Get() { HttpResponseMessage responseMessage = ... return new ResponseMessageResult(responseMessage); } 

Kai kuriais atvejais tai gali būti paprasčiausias būdas gauti norimą rezultatą, nors paprastai gali būti naudinga naudoti skirtingus rezultatus sistemoje.Web.Http.Results.

6
09 янв. atsakymas pateikiamas sfuqua 09 jan. 2017-01-09 22:28 '17, 22:28 pm 2017-01-09 22:28

Čia yra tiek daug atsakymų, bet neradau tokio, kuris leistų man tiesiogiai grąžinti išimties pranešimą atsakymo būsenos apraše.

Pavyzdžiui, jei parašiau WCF paslaugą, galėčiau sekti šią pamoką ir tiesiogiai grąžinti išimties pranešimą kaip atsakymo būsenos dalį:

2019

23 янв. Mike Gledhill atsakymas, pateiktas sausio 23 d 2017-01-23 17:29 '17 17:29 2017-01-23 17:29

Tiesiog:

return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Your message"));

Nepamirškite kreiptis į „ System.Net.Http“ ir „ System.Net“ .

2
10 авг. Rodrigo Reis atsakymas rugpjūčio 10 d 2018-08-10 17:18 '18, 18:18 pm 2018-08-10 17:18

@mayabelle galite sukurti betono „IHttpActionResult“ konkretų variantą:

 public class NotFoundPlainTextActionResult : IHttpActionResult { public NotFoundPlainTextActionResult(HttpRequestMessage request, string message) { Request = request; Message = message; } public string Message { get; private set; } public HttpRequestMessage Request { get; private set; } public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(ExecuteResult()); } public HttpResponseMessage ExecuteResult() { var response = new HttpResponseMessage(); if (!string.IsNullOrWhiteSpace(Message)) //response.Content = new StringContent(Message); response = Request.CreateErrorResponse(HttpStatusCode.NotFound, new Exception(Message)); response.RequestMessage = Request; return response; } } 
1
03 марта '15 в 12:20 2015-03-03 12:20 Atsakymą pateikė Quoc Nguyen kovo 03 d. 15 val. 12:20 2015-03-03 12:20

Išskyrus, aš paprastai tai darau

  catch (Exception ex) { return InternalServerError(new ApplicationException("Something went wrong in this request. internal exception: " + ex.Message)); } 
0
14 февр. atsakymas pateikiamas 14 vasario mėn. 2018-02-14 05:32 '18, 5:32 2018-02-14 05:32

.NET Core galite naudoti: return new StatusCodeResult(500);

0
21 дек. atsakymas pateikiamas Chazt3n 21 d. 2018-12-21 16:46 '18, 16:46 p. 2018-12-21 16:46

Pirmiau minėti dalykai yra tikrai naudingi.

Kuriant interneto paslaugas, jei naudojatės paslaugomis, vartotojas bus labai dėkingas. Bandžiau išlaikyti vienodą produkciją. Taip pat galite pateikti komentarą arba esamą klaidos pranešimą. Interneto paslaugos vartotojas gali tik patikrinti, ar „IsSuccess“ yra teisinga, ar kitaip jis bus tikras, kad yra problema ir veiks pagal situaciją.

  public class Response { /// <summary> /// Gets or sets a value indicating whether this instance is success. /// </summary> /// <value> /// <c>true</c> if this instance is success; otherwise, <c>false</c>. /// </value> public bool IsSuccess { get; set; } = false; /// <summary> /// Actual response if succeed /// </summary> /// <value> /// Actual response if succeed /// </value> public object Data { get; set; } = null; /// <summary> /// Remark if anythig to convey /// </summary> /// <value> /// Remark if anythig to convey /// </value> public string Remark { get; set; } = string.Empty; /// <summary> /// Gets or sets the error message. /// </summary> /// <value> /// The error message. /// </value> public object ErrorMessage { get; set; } = null; } [HttpGet] public IHttpActionResult Employees() { Response _res = new Response(); try { DalTest objDal = new DalTest(); _res.Data = objDal.GetTestData(); _res.IsSuccess = true; return Ok<Response>(_res); } catch (Exception ex) { _res.IsSuccess = false; _res.ErrorMessage = ex; return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, _res )); } } 

Galite pateikti pasiūlymą, jei toks yra :)

0
27 апр. Atsakyti Amol Khandagale 27 Bal. 2018-04-27 12:05 '18, 12:05 val. 2018-04-27 12:05

Šis atsakymas grindžiamas Shamil Yakupov atsakymu, su realaus objekto vietoj eilutės.

 using System.Dynamic; dynamic response = new ExpandoObject(); response.message = "Email address already exist"; return Content<object>(HttpStatusCode.BadRequest, response); 
0
18 нояб. Atsakymą pateikė Kugan Kumar , lapkričio 18 d. 2017-11-18 13:22 '17 at 13:22 pm 2017-11-18 13:22

Aš rekomenduoju perskaityti šį pranešimą. Yra daug būdų naudoti esamą „HttpResponse“, kaip siūloma, bet jei norite naudoti „Web Api 2“, naudokite kai kurias integruotas „IHttpActionResult“ parinktis, pvz.

 return Ok() 

arba

 return NotFound() 

Pasirinkite teisingą „Web Api“ valdiklių grąžinimo tipą

0
01 июня '18 в 20:50 2018-06-01 20:50 atsakymas pateikiamas wegunterjr 01 Birželio 18 d. 20:50 2018-06-01 20:50

Turėjau tą pačią problemą. Noriu sukurti priskirtą rezultatą, kad mano api valdikliai juos skambintų kaip return Ok("some text");

Tada aš padariau: 1) Sukurkite savo rezultato tipą naudodamasis singleletone

 public sealed class EmptyResult : IHttpActionResult { public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) { return Task.FromResult(new HttpResponseMessage(System.Net.HttpStatusCode.NoContent) { Content = new StringContent("Empty result") }); } } 

2) Sukurkite pasirinktinį valdiklį naudodami naują metodą:

 public class CustomApiController : ApiController { public IHttpActionResult EmptyResult() { return new EmptyResult(); } } 

Ir tada galiu juos paskambinti savo valdiklyje, pavyzdžiui:

 public IHttpActionResult SomeMethod() { return EmptyResult(); } 
0
28 июня '17 в 19:59 2017-06-28 19:59 atsakymas pateikiamas Merchezatter birželio 28, 17 d. 19:59 2017-06-28 19:59

Atsiprašome už vėlyvą atsakymą, kodėl ne tik naudojote

return BadRequest("your message");

Aš naudoju jį visoms mano klaidoms IHttpActionResult savo sveikatai

čia yra dokumentacija: https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.badrequest(v=vs.118).aspx

-1
06 нояб. atsakymas, pateiktas lapkričio 6 d 2016-11-06 02:32 '16 at 2:32 2016-11-06 02:32

Peržiūrėkite kitus klausimus, susijusius su arba Užduoti klausimą