Я пишу приложение POC, которое использует Microsoft.ServiceBus.dll 1.0.0.0 (версия .NET 3.5).
Мой контракт и сервис 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: Транспорт
- Режим передачи: потоковый
Когда я пытаюсь присвоить ContentType исходящего ответа «application/json», ошибка не возникает, но запрос вызова возвращается с кодом состояния 504 (время ожидания шлюза).
Если я изменю ContentType на «text/javascript», запрос на вызов вернется с кодом 200 (ОК).
Некоторые вещи, которые следует отметить:
- Тип содержимого неизвестен до времени выполнения, поэтому он должен назначаться динамически.
- Содержимое потока чистое — 100% достоверное — json.
- The intention for accepting and returning a stream is so we can accept streamed requests and stream data down to the client.
- Each request / response could contain a small json payload or a 200MB document.
- Если вы хотите воспроизвести — этот код использует библиотеку Newtonsoft Json для сериализации.
Почему это происходит и как я могу это исправить?
EDIT: код состояния 504 может быть отвлекающим маневром, сделанным скрипачом, с которым я тестирую. Отправка того же запроса из System.Net.Http.HttpClient указывает на то, что соединение закрывается до получения ответа.
РЕДАКТИРОВАТЬ: установка типа содержимого практически на что угодно (включая бессмысленные значения) работает нормально. Единственный тип содержимого, который я могу сломать, — это application/json.