2016-07-01 6 views
1

Wir haben eine Java-Server-Anwendung, die auf Port 5545 auf http-Kommunikation wartet.C# -Client Java-Server HTTP keine Antwort

Auf der anderen Seite befindet sich eine C# -Client-Anwendung, die Anfragen an den Server sendet.

Bevor einige Probleme mit Proxies auftraten, basierte unsere Kommunikation auf TCP/IP.

Jetzt wollen wir zu einer Kommunikation über http wechseln, aber wir haben ein seltsames Verhalten auf der C# -Seite erfahren.

Das Problem auf dem Server PostAsync Method

Unsere Java basiert die Netty 4 Framework mit Frühling verwendet. Wenn der C# -Client die Daten postet, kann ich alles in den netty-Logs sehen. Jetzt in dem Teil, wo der Java-Server die Antwort zurücksendet, geht die C# -Methode in etwas wie ein Deadlock.

Meine Java-Methode, um die Antwort zu senden ist

private boolean writeResponse(boolean isSuccessful, String message, ChannelHandlerContext ctx) { 
    boolean keepAlive = HttpHeaders.isKeepAlive(_httpRequest); 
    FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, 
    isSuccessful ? HttpResponseStatus.OK : HttpResponseStatus.BAD_REQUEST, 
    Unpooled.copiedBuffer(message, CharsetUtil.UTF_8)); 
    response.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP); 
    response.headers().set(HttpHeaders.Names.CONTENT_TYPE, "application/octet-stream; charset=UTF-8"); 
    if (keepAlive) { 
    response.headers().set(HttpHeaders.Names.CONTENT_LENGTH, message.length()); 
    response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE); 
    } 
    ctx.write(response); 
    return keepAlive; 
} 

Der C# Client-Code ist

HttpClientHandler httpClientHandler = new HttpClientHandler(); 
client = new System.Net.Http.HttpClient(httpClientHandler) { BaseAddress = uri }; 

byte[] bytes = ... 
ByteArrayContent byteContent = new ByteArrayContent(bytes); 
var response = await client.PostAsync(uri, byteContent, tokenSource.Token); 

Wenn ich ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); auf der Java-Seite nach dem letzten Schreib hinzufügen. Die PostAsync-Methode erhält eine Antwort, andernfalls bleibt sie hängen, obwohl der Java-Server die Antwort bereits sendet.

Also meine Frage ist, ist das ein normales Verhalten oder kann mir jemand erklären, was wir falsch machen?

+0

Versuchen Sie, Ihrem 'HttpClient' keinen leeren (nutzlosen)' HttpClientHandler' zu geben. – nverinaud

Antwort

1

Sie sollten CONTENT_LENGTH jedes Mal festlegen, nicht nur, wenn keepAlive wahr ist.

[Bearbeiten] Andernfalls weiß der Client nicht, ob und wann Response-Inhalt vollständig empfangen wird und die Post-Methode wird nicht zurückgegeben.

+0

Dies ist keine konstruktive Antwort. –