プロトコルとして HTTP のろくでなし化をサポートするホーム コントロール システム用の Windows 8 'Metro' クライアントを構築しています。WebClient
ソケットを開いたままにし、複数の疑似 HTTP 操作を行う必要があるため、これには使用できません。
サーバーが話すプロトコルは非常に単純で、非常に不変です。これは古いソフトウェアであり、変更されることはありません。したがって、私のクライアント コードは、独自の方法でハードコードすることができます (またそうする必要があります)。
TcpClient
コンソールアプリを使用してこれを正常に構築しました。現在、Win8/Windows Phone に移植してTcpClient
いますが、利用できないことがわかりました。当たり前。
ASP.NET Web API Client Libraries を使用することはできませHttpClient
ん。ソケットを細かく制御できるようには見えないからです。
だから私は立ち往生していWindows.Networking.Sockets
ます。以下は私の現在のコードです(に基づいていTcpClient
ます。このコードは別のスレッドで実行されます。私が言ったように、私のC#コンソールアプリではうまく機能します。
private void ReadSubscriptionResponses()
{
// Process the response.
StreamReader rdr = new StreamReader(_subscriptionClient.GetStream());
int contentLength;
int hashCode = 0;
// From here on we will get responses on the stream that
// look like HTTP POST responses.
while (!rdr.EndOfStream) {
var line = rdr.ReadLine();
Debug.WriteLine(line);
if (line.StartsWith("HTTP/1.1 404 ")) {
string error = line.Substring("HTTP/1.1 404 ".Length);
Debug.WriteLine("Error: " + error);
LastStatusCode = "404";
ParseErrorResponse();
continue;
}
LastStatusCode = "200";
if (line.StartsWith("Target-Element: ")) {
string ID = line.Substring("Target-Element: ".Length);
if (!int.TryParse(ID, out hashCode)) {
Debug.WriteLine("Error: Target-Element: is not an integer.");
}
}
// Content-Length: is always the last HTTP header Premise sends
if (!line.StartsWith("Content-Length: ") ||
!int.TryParse(line.Substring("Content-Length: ".Length), out contentLength)) continue;
if (rdr.EndOfStream) continue;
// Read the blank line that always follows Content-Length:
line = rdr.ReadLine();
Debug.WriteLine(line);
if (rdr.EndOfStream) continue;
// Read content
char[] buffer = new char[contentLength];
rdr.ReadBlock(buffer, 0, contentLength);
line = new string(buffer);
// Send line to our caller ...
}
}
このループは と に基づいているため単純StreamReader.EndOfLine
ですStreamReader.ReadLine
。
Windows.Networking.Sockets.StreamSocket
同様の機能を提供することを望んでいましたが、 EndOfStream
orReadLine
にはありませんDataReader
。StreamSocket
誰かが私がここに収まる使用例を教えてもらえますか?
複数のプラットフォームで実行できるように、このコードを可能な限り移植性を維持したいと考えています。