我正在使用TransferMode.Streamed HttpSelfHostConfiguration exe中的WebApi编写代理。
当我使用fiddler发布到我的ApiController时,由于某种原因,我无法读取Request.Content -即使我有POSTed数据,它也会返回"“
public class ApiProxyController : ApiController
{
public Task<HttpResponseMessage> Post(string path)
{
return Request.Content.ReadAsStringAsync().ContinueWith(s =>
{
var content = new StringContent(s.Result); //s.Result is ""
CopyHeaders(Request.Content.Headers, content.Headers);
return Proxy(path, content);
}).Unwrap();
}
private Task<HttpResponseMessage> Proxy(string path, HttpContent content)
{
...
}
}这是我的web请求
POST http://localhost:3001/api/values HTTP/1.1
Host: localhost:3001
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type: application/json
Content-Length: 26
{ "text":"dfsadfsadfsadf"}我做错了什么?为什么s.Result返回的是空字符串而不是原始json?
发布于 2012-04-17 05:44:55
最后,我通过继承基本接口而不是ApiController实现了这一点-我认为ApiController是模型绑定,它吃掉了响应
编辑:构建代理的正确方法是MessageHandler,而不是ApiController
发布于 2012-09-05 23:13:05
我也为此而苦苦挣扎。ReadAsStringAsync和ReadAsAsync返回一个任务对象。引用Result属性将返回内容。可能是引用Result属性导致异步读取请求阻塞。
示例:
string str = response.Content.ReadAsStringAsync().Result;发布于 2016-01-14 17:59:58
我意识到这是旧的,并且已经得到了回答,但无论它的价值是什么,你不能使用ReadAsStringAsync()的原因并不是因为它像所建议的那样‘吃掉数据’,而是因为内容被作为流处理,并且由于数据已经被消息格式化程序使用,流的位置已经在末尾。
为了使用ReadAsStringAsync(),您首先需要将内容流位置重置到开头。
我这样做:response.RequestMessage.Content.ReadAsStreamAsync().Result.Seek( 0, System.IO.SeekOrigin.Begin ),因为我只有HttpResponseMessage,但是如果你可以直接访问HttpRequestMessage (就像你在控制器中做的那样),你可以使用Request.Content.ReadAsStreamAsync().Result.Seek( 0, System.IO.SeekOrigin.Begin ),我想它在功能上是等效的。
后期编辑
如上所述,使用Result读取异步流在许多情况下会导致死锁和线程阻塞。如果你必须以同步的方式读取异步数据流,最好使用下面的形式:
new TaskFactory( CancellationToken.None,
TaskCreationOptions.None,
TaskContinuationOptions.None,
TaskScheduler.Default )
.StartNew<Task<TResult>>( func )
.Unwrap<TResult>()
.GetAwaiter()
.GetResult();其中,func是您要运行的异步操作,因此在本例中,它将类似于async () => { await Request.Content.ReadAsStreamAsync(); }…通过这种方式,您可以将方法的异步部分放在StartNew部分中,并正确地展开编组回同步代码时发生的任何异常。
更好的是,使整个堆栈同步。
https://stackoverflow.com/questions/10127803
复制相似问题