当前位置: 首页 > 编程语言 > C#

无法在ASP.NET WebApi控制器中读取Request.Content分享

时间:2023-04-11 00:13:09 C#

C#学习教程:无法读取ASP.NETWebApi控制器中的Request.Content当我使用提琴手发布到我的ApiController时,出于某种原因我无法读取Request.Content-即使我有POSTed数据它返回“”publicclassApiProxyController:ApiController{publicTaskPost(stringpath){returnRequest.Content.ReadAsStringAsync().ContinueWith(s=>{varcontent=newStringContent(s.Result);//s.Resultis""CopyHeaders(Request.Content.Headers,content.Headers);returnProxy(path,content);}).展开();}privateTaskProxy(stringpath,HttpContentcontent){...}}这是我的网络请求POSThttp://localhost:3001/api/valuesHTTP/1.1Host:localhost:3001Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Content-Type:application/jsonContent-Length:26{"text":"dfsadfsadfsadf"}我做错了什么?为什么s.Result返回为空字符串而不是原始json?我也挣扎过。ReadAsStringAsync和ReadAsAsync返回任务对象。引用Result属性将返回内容。可能是对Result属性的引用导致异步读取请求被阻止。示例:stringstr=response.Content.ReadAsStringAsync().Result;这个帖子的签名吃帖子数据:publicHttpResponseMessagePost([FromBody]stringpostdata)将它更改为:publicHttpResponseMessagePost()然后这个调用工作正常,获取帖子数据:stringstr=response.Content.ReadAsStringAsync()。结果;测试了自己。对于第一个签名,str是空的,对于第二个str有发布数据!我意识到这是旧的并且已经得到回答,但是就它的价值而言,您不能使用ReadAsStringAsync()的原因不是因为它“按照建议”处理数据,而是因为内容正在作为流处理,并且由于消息格式化程序已经消费了数据,因此流的位置已经在末尾。要使用ReadAsStringAsync(),您首先需要将内容流Position重置为开头。我这样做:response.RequestMessage.Content.ReadAsStreamAsync().Result.Seek(0,System.IO.SeekOrigin.Begin)因为我只有HttpResponseMessage,但是您可以直接访问HttpRequestMessage(就像您一样)在Controller中您可以使用Request.Content.ReadAsStreamAsync().Result.Seek(0,System.IO.SeekOrigin.Begin),我认为这在功能上是等效的。我相信您关于ApiController吃掉Request.Content的说法是正确的。您在ApiController中看到的“Request”对象实际上是System.Net.Http.HttpRequestMessage类型。我能够解决这个问题,但是像这样备份到System.Web.HttpRequest对象:DimcontentasstringIfHttpContext.Current.Request.InputStream.CanSeekThenHttpContext.Current.Request.InputStream.Seek(0,IO.SeekOrigin.Begin)EndIfUsingreaderAsNewSystem.IO.StreamReader(HttpContext.Current.Request.InputStream)content=reader.ReadToEnd()EndUsing我不知道是否需要倒带,但我把它放了以防万一。我最终通过继承基本接口而不是ApiController来做到这一点-我认为ApiController是模型绑定并且它正在吃响应编辑:构建代理的正确方法是MessageHandler,而不是ApiControllerRequest.Content.ReadAsStreamAsync()。Result.Seek(0,System.IO.SeekOrigin.Begin)newSystem.IO.StreamReader(Request.Content.ReadAsStreamAsync().Result).ReadToEnd()尝试用ReadAsAsync()替换ReadAsStringAsync()。您应该为参数使用复杂类型,然后使用一些json,例如{path:"c:..."}AlsusedContent-Type:application/json;charset=UTF-8在你的post请求中的标题,这样webapi就知道文本中包含了json。C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: