私たちは、HTTP通信のためにポート5545でリッスンしているjavaサーバーアプリケーションを持っています。C#クライアントJavaサーバーHTTPレスポンス
もう一方の側では、サーバーに要求を送信するC#クライアントアプリケーションがあります。
プロキシに関するいくつかの問題が発生する前に、私たちの通信はTCP/IPに基づいていました。
ここで、http経由の通信に切り替える必要がありますが、c#側では奇妙な動作があります。
問題は、私たちのJava Serverは春とネッティー4フレームワークを使用しているPostAsync Method
に基づいています。 C#クライアントがデータをポストすると、Nettyログのすべてを見ることができます。 Javaサーバが応答を返す部分では、c#メソッドはデッドロックのようなものになります。私は最後の書き込みの後にJava側にctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
を追加すると、応答を送信するための
私のJavaメソッドが
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);
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;
}
C#のクライアントコードです。 PostAsyncメソッドはレスポンスを取得します。それ以外の場合は、javaサーバーがレスポンスを送信していますが、ただ停止しています。
私の質問は、これは正常な動作ですか、誰かが私に説明してくれる、間違っていることですか?
'HttpClient'に空の(役に立たない)' HttpClientHandler'を与えないようにしてください。 – nverinaud