Streaming 具有PushStreamContent的自托管WebApi能否处理多个请求?
我正在使用HttpSelfHostServer来托管我的WebApi。我返回一个类似这样的内容Streaming 具有PushStreamContent的自托管WebApi能否处理多个请求?,streaming,asp.net-web-api,self-hosting,Streaming,Asp.net Web Api,Self Hosting,我正在使用HttpSelfHostServer来托管我的WebApi。我返回一个类似这样的内容 public HttpResponseMessage Get(HttpRequestMessage request) { var response = request.CreateResponse(); response.Content = new PushStreamContent(OnStreamAvailable,
public HttpResponseMessage Get(HttpRequestMessage request)
{
var response = request.CreateResponse();
response.Content = new PushStreamContent(OnStreamAvailable, "text/eventstream");
return response;
}
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(_baseAddress);
config.TransferMode = System.ServiceModel.TransferMode.Streamed;
config.MaxConcurrentRequests = 10;
在我向api发出第二个请求之前,一切都按预期进行。第一个请求被阻塞,在我关闭第一个请求之前,第二个请求不会到达Get函数
我已经像这样设置了我的配置
public HttpResponseMessage Get(HttpRequestMessage request)
{
var response = request.CreateResponse();
response.Content = new PushStreamContent(OnStreamAvailable, "text/eventstream");
return response;
}
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(_baseAddress);
config.TransferMode = System.ServiceModel.TransferMode.Streamed;
config.MaxConcurrentRequests = 10;
为什么第一个呼叫会阻止第二个呼叫
编辑:
这是我的完整控制器:
public class PushController : ApiController
{
private static readonly ConcurrentBag<StreamWriter> _Writers = new ConcurrentBag<StreamWriter>();
public HttpResponseMessage Get(HttpRequestMessage request)
{
var response = request.CreateResponse();
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Cache-Control", "no-cache, must-revalidate");
response.Content = new PushStreamContent(OnStreamAvailable, "text/event-stream");
return response;
}
private void OnStreamAvailable(Stream stream, HttpContent content, TransportContext context)
{
_Writers.Add(new StreamWriter(stream) { AutoFlush = true });
}
public static void Say(string text)
{
try
{
foreach (var w in _Writers)
{
w.Write("data:{ text : \"" + text + "\" }\n\n");
}
}
catch { }
}
}
公共类PushController:ApicController
{
私有静态只读ConcurrentBag _Writers=新ConcurrentBag();
公共HttpResponseMessage获取(HttpRequestMessage请求)
{
var response=request.CreateResponse();
添加(“访问控制允许源代码”、“*”);
添加(“缓存控制”,“无缓存,必须重新验证”);
response.Content=新的PushStreamContent(OnStreamAvailable,“文本/事件流”);
返回响应;
}
私有void OnStreamAvailable(流、HttpContent内容、TransportContext上下文)
{
_Add(新的StreamWriter(stream){AutoFlush=true});
}
公共静态void Say(字符串文本)
{
尝试
{
foreach(变量w in_Writers)
{
w、 写入(“数据:{text:\”“+text+“\”}\n\n”);
}
}
捕获{}
}
}
我不明白为什么自托管WebAPI不能为并发请求提供服务,即将第二个请求分派到单独的线程上
但是。。。我认为你应该总是
Close
streamPushStreamContent
在你写完所有你要写的东西后给你。您没有添加内容长度
标题,因此客户端不知道何时停止等待更多数据。关闭输出流将告诉客户端不再有输出流了。在OnStreamAvailable中您做了什么?我添加了ApicController。您好@ErikZ,您当时找到原因了吗?