【问题标题】:How to send AMF3 object via HttpClient Post Request如何通过 HttpClient Post Request 发送 AMF3 对象
【发布时间】:2021-04-20 01:40:48
【问题描述】:

我正在开发一个旧网站,它使用 AMF 包将数据发送到服务器。我需要向该网站发送一些文本数据并将该数据保存到该网站。换句话说,我想自动化这个网站。

我找到了 fluorinefx 库,但所有者不再支持它,并且互联网上没有关于此的文档。我尝试使用 fluorinefx 的序列化类来序列化我的字典数据并将其发送到带有内容类型标头 application/x-amf 的服务器。但是 httpclient 不支持 AMF 字节数组。

当我尝试使用 fluorinefx 的 NetConnection 类并使用 netConnection.Connect(url) 方法时,如果 url 以 http:// 开头,则没有问题,但如果 url 以 https// 开头,则会出现 URİFormat 异常。由于我正在开发的网站使用 https://,因此我也无法使用此 Connect 方法。

所以请帮助我,我如何准备一个结构正确的 AMF 对象并使用 HttpClient 发送它。或者是否有任何其他库可用于发送 AMF 包。(我也查看了 WebOrb 和 DotAmf,但这些也不起作用)

谢谢。

【问题讨论】:

    标签: c# http-post httpclient amf


    【解决方案1】:
    public static object SendAMF(string method, object[] arguments)
        {
            AMFMessage message = new AMFMessage(3);
    
            message.AddHeader(new AMFHeader("headerKey", false, "headerValue"));
    
            message.AddBody(new AMFBody(method, "/1", arguments));
    
            MemoryStream ms = new MemoryStream();
            AMFSerializer serializer = new AMFSerializer(ms);
            serializer.WriteMessage(message);
            serializer.Flush();
            serializer.Dispose();
    
            var request = (HttpWebRequest)WebRequest.Create($"{Endpoint}/Gateway.aspx?method={method}");
    
            byte[] data = Encoding.Default.GetBytes(Encoding.Default.GetString(ms.ToArray()));
            request.GetRequestStream().Write(data, 0, data.Length);
    
            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                ms = new MemoryStream();
                response.GetResponseStream().CopyTo(ms);
                dynamic obj = DecodeAMF(ms.ToArray());
                ms.Dispose();
                response.Dispose();
                
                return obj;
            } 
            catch(Exception ex)
            {
                ms.Dispose();
                return "ERROR! " + ex.ToString();
            }
        }
    
    public static dynamic DecodeAMF(byte[] body)
        {
            MemoryStream memoryStream = new MemoryStream(body);
            AMFDeserializer amfdeserializer = new AMFDeserializer(memoryStream);
            AMFMessage amfmessage = amfdeserializer.ReadAMFMessage();
            dynamic content = amfmessage.Bodies[0].Content;
            memoryStream.Dispose();
            amfdeserializer.Dispose();
            return content;
        }
    

    `

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多