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?
Versuchen Sie, Ihrem 'HttpClient' keinen leeren (nutzlosen)' HttpClientHandler' zu geben. – nverinaud