C# QuickFix/n-登录中的自定义字段

C# QuickFix/n-登录中的自定义字段,c#,quickfix,quickfixn,C#,Quickfix,Quickfixn,我正在尝试创建基于QuickFix/n的启动器。 我的对手(服务器)要求登录消息包含两个自定义字段。我已经将它们添加到数据字典中的字段和登录消息中。 在代码中,我可以操作消息来添加用户名和密码,但我找不到如何加载自定义字段 以下是我迄今为止所做工作的一些摘录: TradeClientApp.cs … public void ToAdmin(Message message, SessionID sessionID) { QuickFix.SessionSet

我正在尝试创建基于QuickFix/n的启动器。 我的对手(服务器)要求登录消息包含两个自定义字段。我已经将它们添加到数据字典中的字段和登录消息中。 在代码中,我可以操作消息来添加用户名和密码,但我找不到如何加载自定义字段

以下是我迄今为止所做工作的一些摘录:

TradeClientApp.cs

public void ToAdmin(Message message, SessionID sessionID)
        {
            QuickFix.SessionSettings settings = new QuickFix.SessionSettings("./initiator.cfg");
            List<SessionID> sids = settings.GetSessions().ToList();
            Dictionary settingsDict = settings.Get(sids.First());
            var appName = settingsDict.GetString("ApplicationName");
            var userType = settingsDict.GetString("UserType");

            if (message.GetType() == typeof(QuickFix.FIX44.Logon))
            {
                message.SetField(new Username("USERNAME"));
                message.SetField(new Password("PASSWORD"));
                message.SetField(new QuickFix.Fields.ResetSeqNumFlag(true));

                //tag 9933
                message.SetField(new RawData(string.Format($"9933={appName}")));
                //tag 20110
                message.SetField(new RawData(string.Format($"20110={userType}")));

            }
        }
FIX44.XML文件中

<message name="Logon" msgtype="A" msgcat="admin">
      <field name="EncryptMethod" required="Y" />
      <field name="HeartBtInt" required="Y" />
      <field name="RawDataLength" required="N" />
      <field name="RawData" required="N" />
      <field name="ResetSeqNumFlag" required="N" />
      <field name="NextExpectedMsgSeqNum" required="N" />
      <field name="MaxMessageSize" required="N" />
      <group name="NoMsgTypes" required="N">
        <field name="RefMsgType" required="N" />
        <field name="MsgDirection" required="N" />
      </group>
      <field name="TestMessageIndicator" required="N" />
      <field name="Username" required="N" />
      <field name="Password" required="N" />
      <field name="ApplicationName" required="N" />
      <field name="UserType" required="N" />
    </message>

 <fields>
   ...

   <field number="9933" name="ApplicationName" type="STRING"/>
   <field number="20110" name="UserType" type="STRING" />
 </fields>
</fix>

...
当我尝试连接时,会得到以下日志:

8=FIX.4.49=12035=A34=149=USERNAME52=20191008-21:19:41.49856=TARGETCOMPID96=20110=V98=0108=10141=Y553=USERNAME554=PASSWORD10=097

使用我的示例中所示的RawData,消息携带20110=V作为RawData,即标记96,这对我没有帮助。 我已经试过了

message.Header.SetField(新的StringField(QuickFix.Fields.Tags.UserType,”)

message.SetField(新的QuickFix.Fields.UserType(true))

但两者都不起作用


您究竟是如何向登录消息中添加自定义字段的?

我认为您的
RawData
数据类型有误。这实际上是指原始数据,而不是遵循默认编码的字符串

根据规范:

包含无格式或内容的原始数据的字符串字段 限制。数据字段前面总是紧跟着一个长度 领域长度字段应指定数据的字节数 数据字段的值(直到但不包括终止SOH)

我不太熟悉QuickFIX的C#实现,但您应该能够简单地添加这些带有特定标签号的字段,例如

message.SetField(new StringField(20110, "V"));
我希望没有语法错误,但你应该明白这一点


编辑:我看到您正在手动设置登录消息上的ResetSeqNum字段。这是令人沮丧的。当您在设置中设置ResetSeqNum=Y(您已经有了该设置)时,quickFIX/n应该会处理这个问题。

您查看了吗?@GrantBirchmeier我查看了很多页面,包括这一页。我总是在最下面的“.GetString”处停下来,因为我无法让这行代码正常工作。答案是下面的一些像素。经典的老我,恰到好处。非常感谢你。还感谢您提供有关ResetSeqNum的提示。
message.SetField(new StringField(20110, "V"));