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を使用するように構成されています。
- SecurityMode:トランスポート
- TransferMode:ストリーミング
発信応答のContentTypeを「application/json」に割り当てようとすると、エラーは発生しませんが、呼び出し元の要求はステータスコード504(ゲートウェイタイムアウト)で返されます。
ContentTypeを"text/ javascript"に変更すると、呼び出し元のリクエストは200(OK)で返されます。
注意すべき点:
- コンテンツタイプは実行時までわからないため、動的に割り当てる必要があります。
- ストリームの内容は純粋です-100%有効-json。
- ストリームを受け入れて返す目的は、ストリーミングされたリクエストを受け入れ、データをクライアントにストリーミングできるようにすることです。
- 各リクエスト/レスポンスには、小さなjsonペイロードまたは200MBのドキュメントを含めることができます。
- 再現したい場合-このコードはシリアル化にNewtonsoftJsonライブラリを使用します。
なぜこれが起こっているのですか、どうすればこれを修正できますか?
編集:504ステータスコードは、私がテストしているフィドラーによって推測された赤いニシンである可能性があります。System.Net.Http.HttpClientから同じ要求を送信すると、応答を受信する前に接続が閉じられます。
編集:コンテンツタイプを他のほとんどすべて(無意味な値を含む)に設定すると、正常に機能します。私がそれを破ることができる唯一のコンテンツタイプはapplication/jsonです