我正在编写一个使用 Microsoft.ServiceBus.dll 1.0.0.0(.NET 3.5 版本)的 POC 应用程序。
我的 WCF 合同和服务如下所示:
[ServiceContract(Name="MyServiceContract", Namespace = "http://mydomain.com/")]
internal interface IServiceContract
{
[WebInvoke(Method = "POST", UriTemplate = "/DoOperation")]
[OperationContract]
Stream RelayRequest(Stream requestBody);
}
[ServiceBehavior(Name = "Service1", Namespace = "http://mydomain.com/Service1/", InstanceContextMode = InstanceContextMode.Single)]
internal class Service1 : IServiceContract
{
Stream RelayRequest(Stream requestBody)
{
var contents = GetJsonResponse();
var responseStream = new MemoryStream();
var streamWriter = new StreamWriter(responseStream);
streamWriter.AutoFlush = true;
var writer = new JsonTextWriter(streamWriter);
var serializer = new JsonSerializer();
serializer.Serialize(responseStream, contents);
responseStream.Position = 0 // reset the position of the stream so that it's contents will be read from the beginning.
//Problem Line:
WebOperationContext.OutgoingResponse.ContentType = "application/json";
return responseStream;
}
}
监听端点配置为使用 WebHttpRelayBinding:
- 安全模式:传输
- 传输模式:流式传输
当我尝试将传出响应的 ContentType 分配给“application/json”时,不会发生错误,但调用请求返回状态码 504(网关超时)。
如果我将 ContentType 更改为“text/javascript”,则调用请求返回 200(OK)。
需要注意的一些事项:
- 内容类型直到运行时才知道,因此必须动态分配。
- 流的内容是纯的 - 100% 有效 - json。
- 接受和返回流的目的是让我们可以接受流式请求并将数据流式传输到客户端。
- 每个请求/响应可以包含一个小的 json 有效负载或一个 200MB 的文档。
- 如果您想重现 - 此代码使用 Newtonsoft Json 库进行序列化。
为什么会发生这种情况,我该如何解决?
编辑: 504 状态代码可能是我正在测试的提琴手推断的红鲱鱼。从 System.Net.Http.HttpClient 发送相同的请求表示在收到响应之前连接已关闭。
编辑:将内容类型设置为几乎其他任何东西(包括无意义的值)都可以正常工作。我可以打破它的唯一内容类型是 application/json