0

プロトコルとして 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同様の機能を提供することを望んでいましたが、 EndOfStreamorReadLineにはありませんDataReaderStreamSocket誰かが私がここに収まる使用例を教えてもらえますか?

複数のプラットフォームで実行できるように、このコードを可能な限り移植性を維持したいと考えています。

4

0 に答える 0