如何使用C#.NET CORE 2.0将修复登录消息发送到GDAX

如何使用C#.NET CORE 2.0将修复登录消息发送到GDAX,c#,.net,tcpclient,fix-protocol,gdax-api,C#,.net,Tcpclient,Fix Protocol,Gdax Api,我正在尝试使用C#和.NETCore2.0建立一个fix4.2会话到FIX.gdax.com(docs:)。当我尝试登录时,我收到0字节作为服务器响应。我真的不知道我错了什么,这是代码: private async Task ConnectToGdaxFix() { _socketTcpClient = new TcpClient(); _socketTcpClient.NoDelay = true; _bufferEnd = 0;

我正在尝试使用C#和.NETCore2.0建立一个fix4.2会话到FIX.gdax.com(docs:)。当我尝试登录时,我收到0字节作为服务器响应。我真的不知道我错了什么,这是代码:

    private async Task ConnectToGdaxFix()
    {
        _socketTcpClient = new TcpClient();
        _socketTcpClient.NoDelay = true;
        _bufferEnd = 0;
        await _socketTcpClient.ConnectAsync(_gdaxFixGateway, _gdaxFixPort);
        _sslStream = new SslStream(_socketTcpClient.GetStream());
        await _sslStream.AuthenticateAsClientAsync(_gdaxFixGateway);
        byte[] buffer = new byte[2048];
        var message = await FixSendLoginMessage();
        var bytes = await _sslStream.ReadAsync(buffer, 0, buffer.Length);
    }

    private async Task<string> FixSendLoginMessage()
    {
        var sendTime = DateTime.UtcNow.ToString("yyyyMMdd-HH:mm:ss.fff");
        string msgType = "A";
        var messageSeqNumber = (++messageSeqNum).ToString();
        var senderCompId = "apiKey";
        var targetCompId = "Coinbase";
        var password = "passphrase";
        var accessSign = CreateAccessSign(
                sendTime,
                msgType,
                messageSeqNumber,
                senderCompId,
                targetCompId,
                password
            );
        var logonMessage = $"98=0{'\x01'}108=30{'\x01'}554={password}{'\x01'}96={accessSign}{'\x01'}8013=Y";
        var headerAfter9Tag = $"35={msgType}{'\x01'}34={messageSeqNumber}{'\x01'}52={sendTime}{'\x01'}49={senderCompId}{'\x01'}56={targetCompId}";
        var length = logonMessage.Length + headerAfter9Tag.Length + 1;
        var messageHeader = $"8=FIX.4.2{'\x01'}9={length}{'\x01'}{headerAfter9Tag}";
        var messageWithHeader = $"{messageHeader}{'\x01'}{logonMessage}{'\x01'}";
        int sum = 0;
        int len = messageWithHeader.Length;
        for (int i = 0; i < len; i++)
        {
            sum += Convert.ToChar(messageWithHeader.Substring(i, 1));
        }
        sum = sum % 256;
        var messageWithChecksum = $"{messageWithHeader}10={sum.ToString("000")}{'\x01'}";
        byte[] buffer = Encoding.ASCII.GetBytes(messageWithChecksum);
        await _sslStream.WriteAsync(buffer, 0, buffer.Length);
        await _sslStream.FlushAsync();
        return messageWithChecksum;
    }

    private string CreateAccessSign(
            string sendingTime,
            string msgType,
            string msgSeqNumber,
            string senderCompId,
            string targetCompId,
            string password
        )
    {
        var stringToHash = string.Join('\x01', sendingTime, msgType, msgSeqNumber, senderCompId, targetCompId, password);
        var privateKeyAsBytes = Encoding.UTF8.GetBytes("privateKey");
        using (var hmac = new HMACSHA256(privateKeyAsBytes))
        {
            var signature = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToHash));
            return Convert.ToBase64String(signature);
        }
    }
专用异步任务ConnectToGdaxFix()
{
_socketTcpClient=newtcpclient();
_socketTcpClient.NoDelay=true;
_bufferEnd=0;
wait _socketTcpClient.ConnectAsync(_gdaxFixGateway,_gdaxFixPort);
_sslStream=新的sslStream(_socketTcpClient.GetStream());
等待_sslStream.AuthenticateTasClientAsync(_gdaxFixGateway);
字节[]缓冲区=新字节[2048];
var message=wait FixSendLoginMessage();
var bytes=await _sslStream.ReadAsync(buffer,0,buffer.Length);
}
专用异步任务FixSendLoginMessage()
{
var sendTime=DateTime.UtcNow.ToString(“yyyyMMdd HH:mm:ss.fff”);
字符串msgType=“A”;
var messageSeqNumber=(++messageSeqNum).ToString();
var senderCompId=“apiKey”;
var targetCompId=“Coinbase”;
var password=“passphrase”;
var accessSign=CreateAccessSign(
sendTime,
msgType,
messageSeqNumber,
senderCompId,
目标公司,
密码
);
var logonMessage=$“98=0{'\x01'}108=30{'\x01'}554={password}{'\x01'}96={accessSign}{'\x01'}8013=Y”;
var headerAfter9Tag=$“35={msgType}{'\x01'}34={messageSeqNumber}{'\x01'}52={sendTime}{'\x01'}49={senderCompId}{'\x01'}56={targetCompId}”;
变量长度=logonMessage.length+headerAfter9Tag.length+1;
var messageHeader=$“8=FIX.4.2{'\x01'}9={length}{'\x01'}{headerAfter9Tag}”;
var messageWithHeader=$“{messageHeader}{'\x01'}{logonMessage}{'\x01'}”;
整数和=0;
int len=messageWithHeader.Length;
对于(int i=0;i
有人能帮我看看登录消息或ssl加密有什么问题吗


这是发送到Gdax的消息(敏感数据的字符已被替换,\x01是|以简化视图):8=FIX.4.2 | 9=161 | 35=A | 34=1 | 52=20180124-00:50:34.083 | 49=426123d789fa8e5c3782c549kj9de06e | 56=Coinbase | 98=0 | 108=30 | 554=outswrt | 96=qkE5KPMLjn+Ef9Zgk1/KVL0ETEM6BLINWM6BLINWMDY9=Y