2012-08-22 2 views
0

Когда я пытаюсь использовать общий обработчик сообщений, я сталкиваюсь с ошибками, когда accept или content-type - это html/xml/json, если я использую свой собственный тип, например text/x-json, все работает так, как ожидается, сообщение отправляется моим обработчикам, и поток возвращает данные веб-клиенту. Я прошел через это с помощью отладчика, и мой код успешно создает сообщение, но что-то в привязке к привязке к servicebus и заставляет сервер не отвечать. Есть ли параметр, который мне нужно изменить, чтобы разрешить application/json и заставить служебную шину отправлять необработанные данные, а затем пытаться ее повторно инициализировать?Как я могу использовать WebHttpRelayBinding с запросами приложения/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()); 
} 
+0

Вы пробовали '[WebGet (UriTemplate = "*", ResponseFormat = WebMessageFormat.Json) ] '? – TheDude

+0

У меня нет, ошибка не каждый маршрут возвращает json. –

ответ

0

Вместо использования: 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(); 
    } 
}