如何与SslStream和TcpClient一起发出HTTP Get请求

时间:2019-05-03 12:41:24

标签: c# .net tcpclient sslstream

在我的应用程序中,我正在使用以下代码来验证客户端证书

public static async Task<string> CallApi(string url, Context context)
{
    var hostName = "mytestapp.azurewebsites.net";
    var port = 443;

    Stream keyin = Application.Context.Assets.Open("Server.pfx");
    var password = "pass123";
    using (MemoryStream memStream = new MemoryStream())
    {
        keyin.CopyTo(memStream);
        var certificates = new X509Certificate2Collection(new X509Certificate2(memStream.ToArray(), password));
        await Task.Run(() =>
        {
            // Create a TCP/IP client socket.
            // machineName is the host running the server application.
            TcpClient client = new TcpClient(hostName, port);
            Console.WriteLine("Client connected.");
            // Create an SSL stream that will close the client's stream.
            SslStream sslStream = new SslStream(
                client.GetStream(),
                false,
                ValidateServerCertificate);

            // The server name must match the name on the server certificate.
            try
            {
                sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);
            }
            catch (AuthenticationException e)
            {
                Console.WriteLine("Exception: {0}", e.Message);
                if (e.InnerException != null)
                {
                    Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                }
                Console.WriteLine("Authentication failed - closing the connection.");
                client.Close();
                return;
            }
        });
    }

    return string.Empty;
}

成功通过身份验证后,我要发出HTTP请求。

sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);

在此声明之后。举例来说,我需要在http Get call下面拨打电话

https://mytestapp.azurewebsites.net/api/GetUserProfile?userId=“ Sooraj”

如何调用此呼叫?还是有可能实现相同的目标?

请帮助

1 个答案:

答案 0 :(得分:1)

尝试这样的事情,

try
                    {
                        sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Tls12, true);

                        byte[] buffer = new byte[5120];
                        int bytes;
                        var pqr = string.Format("GET {0}  HTTP/1.1\r\nHost: {1}\r\n\r\n", url, "mytestapp.azurewebsites.net");
                        byte[] request = Encoding.UTF8.GetBytes(pqr);
                        sslStream.Write(request, 0, request.Length);
                        var ppp =  ReadStream(sslStream);
                        sslStream.Flush();

                    }
                    catch (AuthenticationException e)
                    {
                        Console.WriteLine("Exception: {0}", e.Message);
                        if (e.InnerException != null)
                        {
                            Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                        }
                        Console.WriteLine("Authentication failed - closing the connection.");
                        client.Close();
                        return;
                    }


 private static string ReadStream(Stream stream)
        {
            byte[] resultBuffer = new byte[2048];
            string value = "";
            //requestStream.BeginRead(resultBuffer, 0, resultBuffer.Length, new AsyncCallback(ReadAsyncCallback), new result() { buffer = resultBuffer, stream = requestStream, handler = callback, asyncResult = null });
            do
            {
                try
                {
                    int read = stream.Read(resultBuffer, 0, resultBuffer.Length);
                    value += Encoding.UTF8.GetString(resultBuffer, 0, read);

                    if (read < resultBuffer.Length)
                        break;
                }
                catch { break; }
            } while (true);
            return value;
        }

它将为您提供所有数据集的响应。然后我们需要解析所需的信息。