此处将为大家介绍关于asp.net-mvc–在使用WEBAPI时,如何从POST中提取HttpResponseMessage中的内容?的详细内容,此外,我们还将为您介绍关于.NETCore中间件中的反
此处将为大家介绍关于asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?的详细内容,此外,我们还将为您介绍关于.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示、.net Web API 2,return HttpResponseMessage with ObjectContent、asp.net core WebApi 返回 HttpResponseMessage、asp.net – .NET Web API HttpResponseMessage模式?的有用信息。
本文目录一览:- asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?
- .NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示
- .net Web API 2,return HttpResponseMessage with ObjectContent
- asp.net core WebApi 返回 HttpResponseMessage
- asp.net – .NET Web API HttpResponseMessage模式?
asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?
所以,如果我在接受一个对象的控制器上有Post方法(JSON序列化,比方说)并返回一个HttpResponseMessage,其中HttpStatusCode Created和Content设置为同一个对象,Id从null更新为整数,那么我如何使用HttpClient获取在那个Id值?
它可能很简单,但我看到的只是System.Net.Http.StreamContent。从post方法返回Int更好吗?
谢谢。
更新(以下回答):
一个工作的例子……
namespace TryWebAPI.Models { public class YouAreJoking { public int? Id { get; set; } public string ReallyRequiresFourPointFive { get; set; } } } namespace TryWebAPI.Controllers { public class RyeController : ApiController { public HttpResponseMessage Post([FromBody] YouAreJoking value) { //Patience simulated value.Id = 42; return new HttpResponseMessage(HttpStatusCode.Created) { Content = new ObjectContent<YouAreJoking>(value,new JsonMediaTypeFormatter(),new MediaTypeWithQualityHeaderValue("application/json")) }; } } } namespace TryWebapiclient { internal class Program { private static void Main(string[] args) { var result = CreateHumour(); Console.WriteLine(result.Id); Console.ReadLine(); } private static YouAreJoking CreateHumour() { var client = new HttpClient(); var pennyDropsFinally = new YouAreJoking { ReallyRequiresFourPointFive = "yes",Id = null }; YouAreJoking iGetItNow = null; var result = client .PostAsJsonAsync("http://localhost:1326/api/rye",pennyDropsFinally) .ContinueWith(x => { var response = x.Result; var getResponseTask = response .Content .ReadAsAsync<YouAreJoking>() .ContinueWith<YouAreJoking>(t => { iGetItNow = t.Result; return iGetItNow; } ); Task.WaitAll(getResponseTask); return x.Result; }); Task.WaitAll(result); return iGetItNow; } } }
似乎Node.js受到启发。
解决方法
.NET 4(你可以在没有延续的情况下做到这一点)
var resultTask = client.PostAsJsonAsync<MyObject>("http://localhost/api/service",new MyObject()).ContinueWith<HttpResponseMessage>(t => { var response = t.Result; var objectTask = response.Content.ReadAsAsync<MyObject>().ContinueWith<Url>(u => { var myobject = u.Result; //do stuff }); });
.NET 4.5
var response = await client.PostAsJsonAsync<MyObject>("http://localhost/api/service",new MyObject()); var myobject = await response.Content.ReadAsAsync<MyObject>();
.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示
据我所知,您创建了HttpClientHandler
,但没有使用它来构建HttpClient
来进行请求。您仍在使用静态_httpClient
,它对您创建的cookie容器一无所知。
这应该是您使CookieContainer
仍然为空的原因。
看看here,了解如何从HttpResponseMessage
获取cookie。
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
_httpClient = new HttpClient(handler);
var targetRequestMessage = CreateTargetMessage(context,targetUri);
using (var responseMessage = await _httpClient.SendAsync(targetRequestMessage,HttpCompletionOption.ResponseHeadersRead,context.RequestAborted))
{
//var responseCookies = cookies.GetCookies(targetUri).Cast<Cookie>();
IEnumerable<Cookie> responseCookies = cookies.GetCookies(targetUri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
{
if(cookie.Name=="ASP.NET_SessionId")
{
Console.WriteLine(cookie.Name + ": " + cookie.Value);
context.Response.Headers.Add("Set-Cookie",cookie.Name+"="+cookie.Value);
}
}
.net Web API 2,return HttpResponseMessage with ObjectContent
public async TaskHttpResponseMessage Register(AllenRegistration model) { 1. Will return 400 Error return Request.CreateResponse( HttpStatusCode.BadReques t); 2. Will return Json Type like {return1:A,returnBL:B} return new HttpResponseMessa
public async Task
{
1.
Will return 400 Error
return Request.CreateResponse(HttpStatusCode.BadRequest);
2.
Will return Json Type like {"return1":"A","returnB"L:"B"}
return new HttpResponseMessage(HttpStatusCode.OK)
{Content = new ObjectContent
asp.net core WebApi 返回 HttpResponseMessage
ASP.NET WebApi 2 中的示例代码:
[Route("values/{id}")]
public async Task<HttpResponseMessage> Get(string id)
{
var response = Request.CreateResponse(HttpStatusCode.OK);
var accept = Request.Headers.Accept;
var result = await _valuesService.Get(id);
if (accept.Any(x => x.MediaType == "text/html"))
{
response.Content = new StringContent(result, Encoding.UTF8, "text/html");
}
else
{
response.Content = new StringContent(result, Encoding.UTF8, "text/plain");
}
return response;
}
ASP.NET Core WebApi 中的示例代码:
[Route("values/{id}")]
public async Task Get(string id)
{
var accept = Request.GetTypedHeaders().Accept;
var result = await _valuesService.Get(id);
var data = Encoding.UTF8.GetBytes(result);
if (accept.Any(x => x.MediaType == "text/html"))
{
Response.ContentType = "text/html";
}
else
{
Response.ContentType = "text/plain";
}
await Response.Body.WriteAsync(data, 0, data.Length);
}
可以看到,改变还是很大的,主要是两方面:
没有了 Request.CreateResponse
,获取 Accept 需要通过 Request.GetTypedHeaders()
。 没有返回值,而是直接通过数据流的方式写入到 Response.Body
中。
asp.net – .NET Web API HttpResponseMessage模式?
public HttpResponseMessage Get(string id) { var app = apps.Single(c => c.Id == id); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<object>(app,Configuration.Formatters.JsonFormatter) }; }
要么
public Application Get(string id) { return apps.Single(c => c.Id == id); }
我的问题是“正确”的方式? #2要短得多但是#1更好或#2自动做#1#?
解决方法
两种情况下的响应都是相同的(HttpResponseMessage).
HttpResponseMessage允许您使用HTTP协议(例如,通过Headers属性)并统一您的返回类型.
返回CLR类型可以更具可读性,但是您可以放松使用不同状态代码返回不同类型的灵活性,除非您使用动态或对象来抵消返回特定类型的目的.
就个人而言,我更喜欢使用IHttpActionResult(在v2中添加)并在控制器操作上为预期的返回类型指定ResponseTypeAttribute以提高可读性.
[HttpGet] [ResponseType(typeof(Portfolio))] public IHttpActionResult GetPortfolio([FromUri] long id) { // get portfolio return Ok(portfolio); }
您可以使用默认的IHttpActionResult实现轻松地操作响应消息(以RESTful方式)(请参阅上面的OkResult).避免自己构造HttpResponseMessage也可以保持代码清洁. Here是关于IHttpActionResult的官方文章,here是关于HttpResponseMessage和IHttpActionResult的有趣的SO对话.
今天关于asp.net-mvc – 在使用WEB API时,如何从POST中提取HttpResponseMessage中的内容?的分享就到这里,希望大家有所收获,若想了解更多关于.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示、.net Web API 2,return HttpResponseMessage with ObjectContent、asp.net core WebApi 返回 HttpResponseMessage、asp.net – .NET Web API HttpResponseMessage模式?等相关知识,可以在本站进行查询。
本文标签: