Как я могу использовать WebHttpRelayBinding с запросами application/json?
Когда я пытаюсь использовать универсальный обработчик сообщений, я сталкиваюсь с ошибками, когда тип accept или content-type равен html/xml/json, если я использую свой собственный тип, такой как text/x-json, все работает так, как ожидается, сообщение отправлено мои обработчики и поток возвращают данные веб-клиенту. Я прошел через это с помощью отладчика, и мой код успешно создает сообщение, но что-то в привязке служебной шины задыхается и заставляет сервер не отвечать. Есть ли параметр, который мне нужно изменить, чтобы разрешить application/json и заставить служебную шину отправлять необработанные данные, а не пытаться повторно их идентифицировать?
[WebGet( UriTemplate = "*" )]
[OperationContract( AsyncPattern = true )]
public IAsyncResult BeginGet( AsyncCallback callback, object state )
{
var context = WebOperationContext.Current;
return DispatchToHttpServer( context.IncomingRequest, null, context.OutgoingResponse, _config.BufferRequestContent, callback, state );
}
public Message EndGet( IAsyncResult ar )
{
var t = ar as Task<Stream>;
var stream = t.Result;
return StreamMessageHelper.CreateMessage( MessageVersion.None, "GETRESPONSE", stream ?? new MemoryStream() );
}
1 ответ
Вместо использования: StreamMessageHelper.CreateMessage, вы можете использовать следующий после изменения:
WebOperationContext.Current.OutgoingResponse.ContentTYpe = "application/json"
public Message CreateJsonMessage(MessageVersion version, string action, Stream jsonStream)
{
var bodyWriter = new JsonStreamBodyWriter(jsonStream);
var message = Message.CreateMessage(version, action, bodyWriter);
message.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
return message;
}
class JsonStreamBodyWriter : BodyWriter
{
Stream jsonStream;
public JsonStreamBodyWriter(Stream jsonStream)
: base(false)
{
this.jsonStream = jsonStream;
}
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
writer.WriteNode(JsonReaderWriterFactory.CreateJsonReader(this.jsonStream, XmlDictionaryReaderQuotas.Max), false);
writer.Flush();
}
}