public override void Invoke(AMFContext context) { AMFDeserializer deserializer = new AMFDeserializer(context.InputStream); deserializer.UseLegacyCollection = _useLegacyCollection; try { AMFMessage amfMessage = deserializer.ReadAMFMessage(); context.AMFMessage = amfMessage; context.MessageOutput = new MessageOutput(amfMessage.Version); if (deserializer.FailedAMFBodies.Length > 0) { AMFBody[] failedAMFBodies = deserializer.FailedAMFBodies; //Write out failed AMFBodies for (int i = 0; i < failedAMFBodies.Length; i++) { context.MessageOutput.AddBody(failedAMFBodies[i]); } } } catch { Dump(context.InputStream); throw; } }
public void ReadMessageWithMultipleHeadersAndBodies() { SetStreamContents(new byte[] { 0x12, 0x34, // version 0x00, 0x02, // header count 0x00, 0x03, 0x61, 0x62, 0x63, 0x01, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x03, 0x31, 0x32, 0x33, // header abc 0x00, 0x03, 0x64, 0x65, 0x66, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, // header def 0x00, 0x02, // body count 0x00, 0x02, 0x74, 0x6f, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x03, 0x31, 0x32, 0x33, // first body 0x00, 0x02, 0x74, 0x6f, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x05 // second body }); AMFMessage message = AMFMessageReader.ReadAMFMessage(input); Assert.AreEqual(0x1234, message.Version); Assert.AreEqual(2, message.Headers.Count); Assert.AreEqual("abc", message.Headers[0].Name); Assert.AreEqual(true, message.Headers[0].MustUnderstand); Assert.AreEqual(new ASString("123"), message.Headers[0].Content); Assert.AreEqual("def", message.Headers[1].Name); Assert.AreEqual(false, message.Headers[1].MustUnderstand); Assert.AreEqual(null, message.Headers[1].Content); Assert.AreEqual(2, message.Bodies.Count); Assert.AreEqual("to", message.Bodies[0].RequestTarget); Assert.AreEqual("from", message.Bodies[0].ResponseTarget); Assert.AreEqual(new ASString("123"), message.Bodies[0].Content); Assert.AreEqual("to", message.Bodies[1].RequestTarget); Assert.AreEqual("from", message.Bodies[1].ResponseTarget); Assert.AreEqual(null, message.Bodies[1].Content); }
/// <summary> /// 发送基于x-amf3的http请求 /// </summary> /// <param name="requestUrl">请求url</param> /// <param name="amfMessage">amf3的报文体</param> /// <param name="cookieContainer">请求的cookie</param> public static WebResponse Amf3RequestHelper(string requestUrl, AMFMessage amfMessage, CookieContainer cookieContainer = null) { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requestUrl); req.Method = "POST"; req.ContentType = "application/x-amf"; req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"; req.CookieContainer = cookieContainer; req.LoadConfig(requestUrl); using (Stream stream = req.GetRequestStream()) { using (AMFSerializer AMFSerializer = new AMFSerializer(stream)) { AMFSerializer.WriteMessage(amfMessage); } } try { return(req.GetResponse()); } catch (WebException ex) { if (ex.Message.Contains("502")) { Console.WriteLine("连接远程服务器时发生错误!", ex); throw new Exception("地址:" + requestUrl + "连接失败,(ERROR:-1)"); } throw ex; } }
public void Call<T>(string command, Responder<T> responder, params object[] arguments) { try { TypeHelper._Init(); Uri uri = new Uri(_gatewayUrl); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.ContentType = ContentType.AMF; request.Method = "POST"; #if !(SILVERLIGHT) request.CookieContainer = _netConnection.CookieContainer; #endif AMFMessage amfMessage = new AMFMessage((ushort)_netConnection.ObjectEncoding); AMFBody amfBody = new AMFBody(command, responder.GetHashCode().ToString(), arguments); amfMessage.AddBody(amfBody); foreach (KeyValuePair<string, AMFHeader> entry in _netConnection.Headers) { amfMessage.AddHeader(entry.Value); } AmfRequestData amfRequestData = new AmfRequestData(request, amfMessage, null, null, responder); request.BeginGetRequestStream(BeginRequestFlashCall, amfRequestData); } catch (Exception ex) { _netConnection.RaiseNetStatus(ex); } }
public RequestData(HttpWebRequest request, AMFMessage amfMessage, PendingCall call, IPendingServiceCallback callback) { this._call = call; this._request = request; this._amfMessage = amfMessage; this._callback = callback; }
/// <summary> /// This method supports the Fluorine infrastructure and is not intended to be used directly from your code. /// </summary> /// <param name="amfMessage"></param> public void WriteMessage(AMFMessage amfMessage) { try { WriteShort(amfMessage.Version); var headerCount = amfMessage.HeaderCount; WriteShort(headerCount); for (var i = 0; i < headerCount; i++) { WriteHeader(amfMessage.GetHeaderAt(i), ObjectEncoding.AMF0); } var bodyCount = amfMessage.BodyCount; WriteShort(bodyCount); for (var i = 0; i < bodyCount; i++) { var responseBody = amfMessage.GetBodyAt(i) as ResponseBody; if (responseBody != null && !responseBody.IgnoreResults) { responseBody.WriteBody(amfMessage.ObjectEncoding, this); } else { var amfBody = amfMessage.GetBodyAt(i); ValidationUtils.ObjectNotNull(amfBody, "amfBody"); amfBody.WriteBody(amfMessage.ObjectEncoding, this); } } } catch (Exception exception) { if (Log.IsFatalEnabled) Log.Fatal(String.Format(Resources.Amf_SerializationFail), exception); throw; } }
public void Call(string command, IPendingServiceCallback callback, params object[] arguments) { try { TypeHelper._Init(); Uri requestUri = new Uri(this._gatewayUrl); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri); request.ContentType = "application/x-amf"; request.Method = "POST"; request.CookieContainer = this._netConnection.CookieContainer; AMFMessage amfMessage = new AMFMessage((ushort)this._netConnection.ObjectEncoding); AMFBody body = new AMFBody(command, callback.GetHashCode().ToString(), arguments); amfMessage.AddBody(body); foreach (KeyValuePair <string, AMFHeader> pair in this._netConnection.Headers) { amfMessage.AddHeader(pair.Value); } PendingCall call = new PendingCall(command, arguments); RequestData state = new RequestData(request, amfMessage, call, callback); request.BeginGetRequestStream(new AsyncCallback(this.BeginRequestFlashCall), state); } catch (Exception exception) { this._netConnection.RaiseNetStatus(exception); } }
/// <summary> /// One of the two main entry points into the encoder. Called by WCF to write a message of less than a specified size to a byte array buffer at the specified offset. /// </summary> /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message"/> to write to the message buffer.</param> /// <param name="maxMessageSize">The maximum message size that can be written.</param> /// <param name="bufferManager">The <see cref="T:System.ServiceModel.Channels.BufferManager"/> that manages the buffer to which the message is written.</param> /// <param name="messageOffset">The offset of the segment that begins from the start of the byte array that provides the buffer.</param> /// <returns> /// A <see cref="T:System.ArraySegment`1"/> of type byte that provides the buffer to which the message is serialized. /// </returns> public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) { MemoryStream memoryStream = new MemoryStream(); AMFMessage amfMessage = message.Properties["amf"] as AMFMessage; AMFSerializer serializer = new AMFSerializer(memoryStream); serializer.WriteMessage(amfMessage); serializer.Flush(); // To avoid a buffer copy, we grab a reference to the stream's internal buffer. // The byte[] we receive may contain extra nulls after the actual data, due to the // buffer management mechanisms of the MemoryStream. Thus, to obtain the message's // length, we need to examine memoryStream.Position rather than messageBytes.Length. byte[] messageBytes = memoryStream.GetBuffer(); int messageLength = (int)memoryStream.Position; memoryStream.Close(); int totalLength = messageLength + messageOffset; byte[] finalBuffer = bufferManager.TakeBuffer(totalLength); Array.Copy(messageBytes, 0, finalBuffer, messageOffset, messageLength); ArraySegment <byte> byteArray = new ArraySegment <byte>(finalBuffer, messageOffset, messageLength); return(byteArray); }
public void SpecialConstructorInitializesProperties() { AMFMessage message = new AMFMessage(123, new AMFHeader[] { new AMFHeader() }, new AMFBody[] { new AMFBody() }); Assert.AreEqual(123, message.Version); Assert.AreEqual(1, message.Bodies.Count); Assert.AreEqual(1, message.Headers.Count); }
public AmfRequestData(HttpWebRequest request, AMFMessage amfMessage, PendingCall call, IPendingServiceCallback callback, object responder) { _call = call; _responder = responder; _request = request; _amfMessage = amfMessage; _callback = callback; }
public override void Invoke(AMFContext context) { AMFMessage aMFMessage = context.AMFMessage; if (aMFMessage.GetHeader("DescribeService") != null) { aMFMessage.GetBodyAt(0).IsDescribeService = true; } }
/// <summary> /// One of the two main entry points into the encoder. Called by WCF to decode a buffered byte array into a message. /// </summary> /// <param name="buffer">A <see cref="T:System.ArraySegment`1"/> of type <see cref="T:System.Byte"/> that provides the buffer from which the message is deserialized.</param> /// <param name="bufferManager">The <see cref="T:System.ServiceModel.Channels.BufferManager"/> that manages the buffer from which the message is deserialized.</param> /// <param name="contentType">The Multipurpose Internet Mail Extensions (MIME) message-level content-type.</param> /// <returns> /// The <see cref="T:System.ServiceModel.Channels.Message"/> that is read from the stream specified. /// </returns> public override Message ReadMessage(ArraySegment <byte> buffer, BufferManager bufferManager, string contentType) { MemoryStream memoryStream = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count - buffer.Offset); AMFDeserializer amfDeserializer = new AMFDeserializer(memoryStream); AMFMessage amfMessage = amfDeserializer.ReadAMFMessage(); Message returnMessage = Message.CreateMessage(MessageVersion.None, null); returnMessage.Properties.Add("amf", amfMessage); return(returnMessage); }
public override void Invoke(AMFContext context) { AMFMessage amfMessage = context.AMFMessage; AMFHeader amfHeader = amfMessage.GetHeader(AMFHeader.ServiceBrowserHeader); if (amfHeader != null) { AMFBody amfBody = amfMessage.GetBodyAt(0); amfBody.IsDescribeService = true; } }
public override void Invoke(AMFContext context) { AMFMessage amfMessage = context.AMFMessage; AMFHeader amfHeader = amfMessage.GetHeader(AMFHeader.DebugHeader); if (amfHeader != null) { //The value of the header ASObject asObject = amfHeader.Content as ASObject; //["error"]: {true} //["trace"]: {true} //["httpheaders"]: {false} //["coldfusion"]: {true} //["amf"]: {false} //["m_debug"]: {true} //["amfheaders"]: {false} //["recordset"]: {true} AMFBody amfBody = amfMessage.GetBodyAt(amfMessage.BodyCount - 1); //last body ResponseBody amfBodyOut = new ResponseBody(); amfBodyOut.Target = amfBody.Response + AMFBody.OnDebugEvents; amfBodyOut.Response = null; amfBodyOut.IsDebug = true; ArrayList headerResults = new ArrayList(); ArrayList result = new ArrayList(); headerResults.Add(result); if ((bool)asObject["httpheaders"] == true) { //If the client wants http headers result.Add(new HttpHeader( )); } if ((bool)asObject["amfheaders"] == true) { result.Add(new AMFRequestHeaders(amfMessage)); } ArrayList traceStack = NetDebug.GetTraceStack(); if ((bool)asObject["trace"] == true && traceStack != null && traceStack.Count > 0) { ArrayList tmp = new ArrayList(traceStack); result.Add(new TraceHeader(tmp)); NetDebug.Clear(); } //http://osflash.org/amf/envelopes/remoting/debuginfo amfBodyOut.Content = headerResults; context.MessageOutput.AddBody(amfBodyOut); } NetDebug.Clear(); }
/// <summary> /// 序列化 /// </summary> /// <param name="uncodedMessage"></param> /// <returns></returns> public byte[] GetAmfBinaryMessageAsBinary(string uncodedMessage) { AMFMessage message = JsonConvert.DeserializeObject <AMFMessage>(uncodedMessage, new AMFMessageConverter()); // AMFMessage message = JsonConvert.DeserializeObject<AMFMessage>(uncodedMessage,new JsonSerializerSettings() // { // MissingMemberHandling = MissingMemberHandling.Error // }); byte[] bytes = this.LoadAmfMessageIntoBinMessage(message); return(bytes); }
public AMFRequestHeaders(AMFMessage amfMessage) { this["EventType"] = "AmfHeaders"; Hashtable hashtable = new Hashtable(); for(int i = 0; i < amfMessage.HeaderCount; i++) { AMFHeader amfHeader = amfMessage.GetHeaderAt(i); if( amfHeader != null && amfHeader.Name != null ) hashtable[amfHeader.Name] = amfHeader.Content; } this["AmfHeaders"] = hashtable; }
//One of the two main entry points into the encoder. Called by WCF to encode a Message into a buffered byte array. public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) { MemoryStream memoryStream = new MemoryStream(); AMFMessage amfMessage = message.Properties["amf"] as AMFMessage; AMFSerializer serializer = new AMFSerializer(memoryStream); serializer.WriteMessage(amfMessage); serializer.Flush(); byte[] buffer = memoryStream.ToArray(); ArraySegment <byte> byteArray = new ArraySegment <byte>(buffer); return(byteArray); }
public byte[] LoadAmfMessageIntoBinMessage(AMFMessage message) { byte[] buffer = null; MemoryStream stream = new MemoryStream(); AMFSerializer amfSerializers = new AMFSerializer(stream); amfSerializers.WriteMessage(message); amfSerializers.Flush(); buffer = new byte[amfSerializers.BaseStream.Length]; stream.Position = 0; stream.Read(buffer, 0, buffer.Length); return buffer; }
/// <summary> /// Сериализует объект в буффер AMF. /// </summary> /// <param name="sourceObject">Исходный объект.</param> /// <param name="version">Версия AMF.</param> /// <returns></returns> public static byte[] SerializeToAmf(this object sourceObject, ushort version) { using (MemoryStream memoryStream = new MemoryStream()) // Открываем поток для записи данных в буфер. using (AMFSerializer amfSerializer = new AMFSerializer(memoryStream)) // Инициализируем сериализатор для AMF. { AMFMessage amfMessage = new AMFMessage(version); // Создаём сообщение для передачи серверу с заданным номером версии AMF. AMFBody amfBody = new AMFBody(AMFBody.OnResult, null, GenerateType(sourceObject)); // Создаём тело для сообщения AMF. amfMessage.AddBody(amfBody); // Добавляем body для сообщения AMF. amfSerializer.WriteMessage(amfMessage); // Сериализуем сообщение. return(memoryStream.ToArray()); // Преобразовывает поток памяти в буфер и возвращает. } }
public void Call(string endpoint, string destination, string source, string operation, IPendingServiceCallback callback, params object[] arguments) { if (this._netConnection.ObjectEncoding == ObjectEncoding.AMF0) { throw new NotSupportedException("AMF0 not supported for Flex RPC"); } try { TypeHelper._Init(); Uri requestUri = new Uri(this._gatewayUrl); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri); request.ContentType = "application/x-amf"; request.Method = "POST"; request.CookieContainer = this._netConnection.CookieContainer; AMFMessage amfMessage = new AMFMessage((ushort)this._netConnection.ObjectEncoding); RemotingMessage message2 = new RemotingMessage { clientId = Guid.NewGuid().ToString("D"), destination = destination, messageId = Guid.NewGuid().ToString("D"), timestamp = 0L, timeToLive = 0L }; message2.SetHeader("DSEndpoint", endpoint); if (this._netConnection.ClientId == null) { message2.SetHeader("DSId", "nil"); } else { message2.SetHeader("DSId", this._netConnection.ClientId); } message2.source = source; message2.operation = operation; message2.body = arguments; foreach (KeyValuePair <string, AMFHeader> pair in this._netConnection.Headers) { amfMessage.AddHeader(pair.Value); } AMFBody body = new AMFBody(null, null, new object[] { message2 }); amfMessage.AddBody(body); PendingCall call = new PendingCall(source, operation, arguments); RequestData state = new RequestData(request, amfMessage, call, callback); request.BeginGetRequestStream(new AsyncCallback(this.BeginRequestFlexCall), state); } catch (Exception exception) { this._netConnection.RaiseNetStatus(exception); } }
private AMFMessage ReadMessage(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.StartObject) { throw new JsonReaderException("AMFMessage must be a JSON Object"); } AMFMessage message = new AMFMessage(); for (reader.Read(); reader.TokenType != JsonToken.EndObject; reader.Read()) { if (reader.TokenType != JsonToken.PropertyName) { throw new JsonReaderException("JSON format error, JSON Object must have property"); } string propertyName = (string)reader.Value; switch (propertyName) { case "Version": reader.Read(); if (reader.TokenType != JsonToken.Integer) { throw new JsonReaderException("AMFMessage 'Version' must be JSON Number"); } message = new AMFMessage(Convert.ToUInt16(reader.Value)); break; case "Bodies": reader.Read(); if (reader.TokenType != JsonToken.StartArray) { throw new JsonReaderException("AMFMessage 'Bodies' must be JSON Array"); } for (reader.Read(); reader.TokenType != JsonToken.EndArray; reader.Read()) { AMFBody body = serializer.Deserialize <AMFBody>(reader); message.AddBody(body); } break; default: throw new NotSupportedException("AMFMessage dont support property " + propertyName + ", please report this"); break; } } return(message); }
public AMFRequestHeaders(AMFMessage amfMessage) { this["EventType"] = "AmfHeaders"; Hashtable hashtable = new Hashtable(); for (int i = 0; i < amfMessage.HeaderCount; i++) { AMFHeader headerAt = amfMessage.GetHeaderAt(i); if ((headerAt != null) && (headerAt.Name != null)) { hashtable[headerAt.Name] = headerAt.Content; } } this["AmfHeaders"] = hashtable; }
public AMFRequestHeaders(AMFMessage amfMessage) { this["EventType"] = "AmfHeaders"; Hashtable hashtable = new Hashtable(); for (int i = 0; i < amfMessage.HeaderCount; i++) { AMFHeader amfHeader = amfMessage.GetHeaderAt(i); if (amfHeader != null && amfHeader.Name != null) { hashtable[amfHeader.Name] = amfHeader.Content; } } this["AmfHeaders"] = hashtable; }
public byte[] LoadAmfMessageIntoBinMessage(AMFMessage message) { byte[] buffer = null; MemoryStream stream = new MemoryStream(); AMFSerializer amfSerializers = new AMFSerializer(stream); amfSerializers.WriteMessage(message); amfSerializers.Flush(); buffer = new byte[amfSerializers.BaseStream.Length]; stream.Position = 0; stream.Read(buffer, 0, buffer.Length); return(buffer); }
public void Call(string endpoint, string destination, string source, string operation, IPendingServiceCallback callback, params object[] arguments) { if (_netConnection.ObjectEncoding == ObjectEncoding.AMF0) { throw new NotSupportedException("AMF0 not supported for Flex RPC"); } try { TypeHelper._Init(); Uri uri = new Uri(_gatewayUrl); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.ContentType = ContentType.AMF; request.Method = "POST"; #if !(SILVERLIGHT) request.CookieContainer = _netConnection.CookieContainer; #endif AMFMessage amfMessage = new AMFMessage((ushort)_netConnection.ObjectEncoding); RemotingMessage remotingMessage = new RemotingMessage(); remotingMessage.clientId = Guid.NewGuid().ToString("D"); remotingMessage.destination = destination; remotingMessage.messageId = Guid.NewGuid().ToString("D"); remotingMessage.timestamp = 0; remotingMessage.timeToLive = 0; remotingMessage.SetHeader(MessageBase.EndpointHeader, endpoint); remotingMessage.SetHeader(MessageBase.FlexClientIdHeader, _netConnection.ClientId ?? "nil"); //Service stuff remotingMessage.source = source; remotingMessage.operation = operation; remotingMessage.body = arguments; foreach (KeyValuePair <string, AMFHeader> entry in _netConnection.Headers) { amfMessage.AddHeader(entry.Value); } AMFBody amfBody = new AMFBody(null, null, new object[] { remotingMessage }); amfMessage.AddBody(amfBody); PendingCall call = new PendingCall(source, operation, arguments); AmfRequestData amfRequestData = new AmfRequestData(request, amfMessage, call, callback, null); request.BeginGetRequestStream(BeginRequestFlexCall, amfRequestData); } catch (Exception ex) { _netConnection.RaiseNetStatus(ex); } }
public void CanGetAndSetProperties() { AMFMessage message = new AMFMessage(); Assert.AreEqual(0, message.Version); message.Version = 123; Assert.AreEqual(123, message.Version); Assert.AreEqual(0, message.Bodies.Count); message.Bodies.Add(new AMFBody()); Assert.AreEqual(1, message.Bodies.Count); Assert.AreEqual(0, message.Headers.Count); message.Headers.Add(new AMFHeader()); Assert.AreEqual(1, message.Headers.Count); }
private void parse(string amf, string name) { byte[] bbb = StrToToHexByte(amf); AMFDeserializer ad = new AMFDeserializer(new MemoryStream(bbb)); AMFMessage message = ad.ReadAMFMessage(); string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(message); //Write that JSON to txt file File.WriteAllText(@"z:\temp\hotel\" + name + @".json", json); foreach (var body in message.Bodies) { object[] content = body.Content as object[]; RemotingMessage rm = content[0] as RemotingMessage; rm.messageId = Guid.NewGuid().ToString("D"); object[] bodys = rm.body as object[]; ASObject ab = bodys[2] as ASObject; ASObject masterBase = ab["masterBase"] as ASObject; masterBase["dep"] = DateTime.Now; masterBase["arr"] = DateTime.Now; masterBase["rsvMan"] = "马一一"; masterBase["cutoffDate"] = DateTime.Now; ASObject masterGuest = ab["masterGuest"] as ASObject; masterGuest["name"] = "马一一"; masterGuest["name2"] = "Ma Yi Yi"; masterGuest["sex"] = "1"; ArrayCollection rsvSrcList = ab["rsvSrcList"] as ArrayCollection; ASObject rsvObject = rsvSrcList[0] as ASObject; rsvObject["arrDate"] = DateTime.Now; rsvObject["depDate"] = DateTime.Now; rsvObject["rsvArrDate"] = DateTime.Now; rsvObject["rsvDepDate"] = DateTime.Now; rsvObject["negoRate"] = 268; rsvObject["oldRate"] = 268; rsvObject["realRate"] = 268; rsvObject["rackRate"] = 268; } }
public void WriteMessageWrapsErrorsWithAMFException() { // Deliberately inject an exception. // This should be caught and wrapped by the AMFMessageWriter code. IASValue mockValue = Mocks.CreateMock <IASValue>(); mockValue.AcceptVisitor(serializer, null); LastCall.IgnoreArguments().Throw(new Exception("Something bad happened.")); Mocks.ReplayAll(); AMFMessage message = new AMFMessage(); message.Version = 0x1234; message.Headers.Add(new AMFHeader("abc", true, mockValue)); AMFMessageWriter.WriteAMFMessage(output, message); }
/// <summary> /// 获取当前的村委会清单 /// </summary> /// <param name="cookie"></param> /// <param name="responseNo"></param> /// <returns></returns> public DataSet GetSysCommittee(string cookie, string responseNo) { DataSet dtUploadSetRow = new DataSet(); ManagerBase mb = new ManagerBase(SendType.Query); byte[] byteSend = GetNode(responseNo); string sendHeader = CommonExtensions.GetSendHeader(cookie, byteSend.Length).ToString(); mb.SendMessage(cookie, byteSend, sendHeader); AMFDeserializer ad = new AMFDeserializer(new MemoryStream(mb.socketReceiveData)); AMFMessage timeMessage = ad.ReadAMFMessage(); mb.socketReceiveData = null; if (timeMessage.BodyCount == 0 || timeMessage.Bodies.FirstOrDefault().Content is FluorineFx.Messaging.Messages.ErrorMessage) { CommonExtensions.WriteLog("不存在"); return(dtUploadSetRow); } var content = (AcknowledgeMessage)timeMessage.Bodies.FirstOrDefault().Content; // node 字符串 /* * <node id='3064' name='中亚南路街道办事处' level='4' levelCN='乡镇' code='650104014' isLoad='true' isBranch='true'> * <node id='3718' name='团结新村社区居委会' level='5' levelCN='村' code='650104014007' isLoad='false' ></node> * <node id='3721' name='铁路花园社区居委会' level='5' levelCN='村' code='650104014010' isLoad='false' ></node> * </node> */ var strNodes = content.body.ToString(); using (StringReader xmlSR = new StringReader(strNodes)) { dtUploadSetRow.ReadXml(xmlSR); } return(dtUploadSetRow); }
/// <summary> /// This method supports the Fluorine infrastructure and is not intended to be used directly from your code. /// </summary> /// <returns></returns> public AMFMessage ReadAMFMessage() { // Version stored in the first two bytes. var version = ReadUInt16(); var message = new AMFMessage(version); // Read header count. int headerCount = ReadUInt16(); for (var i = 0; i < headerCount; i++) { message.AddHeader(ReadHeader()); } // Read header count. int bodyCount = ReadUInt16(); for (var i = 0; i < bodyCount; i++) { var amfBody = ReadBody(); if (amfBody != null) //not failed message.AddBody(amfBody); } return message; }
public override void Invoke(AMFContext context) { AMFDeserializer deserializer = new AMFDeserializer(context.InputStream) { UseLegacyCollection = this._useLegacyCollection }; AMFMessage message = deserializer.ReadAMFMessage(); context.AMFMessage = message; context.MessageOutput = new MessageOutput(message.Version); if (deserializer.FailedAMFBodies.Length > 0) { AMFBody[] failedAMFBodies = deserializer.FailedAMFBodies; for (int i = 0; i < failedAMFBodies.Length; i++) { context.MessageOutput.AddBody(failedAMFBodies[i]); } } }
public override Task Invoke(AMFContext context) { AMFDeserializer deserializer = new AMFDeserializer(context.InputStream); deserializer.UseLegacyCollection = _useLegacyCollection; AMFMessage amfMessage = deserializer.ReadAMFMessage(); context.AMFMessage = amfMessage; context.MessageOutput = new MessageOutput(amfMessage.Version); if (deserializer.FailedAMFBodies.Length > 0) { AMFBody[] failedAMFBodies = deserializer.FailedAMFBodies; //Write out failed AMFBodies for (int i = 0; i < failedAMFBodies.Length; i++) { context.MessageOutput.AddBody(failedAMFBodies[i]); } } return(Task.FromResult <object>(null)); }
private async void sendBtn_Click(object sender, EventArgs e) { object[] arguments = { Convert.ToInt32(textBox1.Text) }; AMFMessage _amf = new AMFMessage(3); _amf.AddHeader(new AMFHeader("id", false, Hash.createChecksum(arguments))); _amf.AddHeader(new AMFHeader("needClassName", false, true)); _amf.AddBody(new AMFBody("MovieStarPlanet.WebService.UserSession.AMFUserSessionService.GetActorNameFromId", "/1", arguments)); MemoryStream mStream = new MemoryStream(); AMFSerializer serialize = new AMFSerializer(mStream); serialize.WriteMessage(_amf); HttpClient client = new HttpClient(); byte[] AMFBytes = Encoding.Default.GetBytes(Encoding.Default.GetString(mStream.ToArray())); ///Set referer to send AMF without 404 error Uri referer = new Uri("https://assets.mspcdns.com/msp/91.0.2/Main_20200728_110605.swf"); client.DefaultRequestHeaders.Referrer = referer; try { string gateway = "https://ws-" + comboBox1.Text + ".mspapis.com/msp/91.0.6/Gateway.aspx?method=MovieStarPlanet.WebService.UserSession.AMFUserSessionService.GetActorNameFromId"; var AMFHttpClientByteArray = new ByteArrayContent(AMFBytes); AMFHttpClientByteArray.Headers.ContentType = new MediaTypeHeaderValue("application/x-amf"); var response = await client.PostAsync(gateway, AMFHttpClientByteArray); //Response string responseString = response.Content.ReadAsStringAsync().Result; string final = JsonConvert.SerializeObject(responseString); MessageBox.Show(final); } catch (WebException exception) { MessageBox.Show("Error!" + exception); } }
public void WriteMessageWithMultipleHeadersAndBodies() { AMFMessage message = new AMFMessage(); message.Version = 0x1234; message.Headers.Add(new AMFHeader("abc", true, new ASString("123"))); message.Headers.Add(new AMFHeader("def", false, null)); message.Bodies.Add(new AMFBody("to", "from", new ASString("123"))); message.Bodies.Add(new AMFBody("to", "from", null)); AMFMessageWriter.WriteAMFMessage(output, message); CollectionAssert.AreElementsEqual(new byte[] { 0x12, 0x34, // version 0x00, 0x02, // header count 0x00, 0x03, 0x61, 0x62, 0x63, 0x01, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x03, 0x31, 0x32, 0x33, // header abc 0x00, 0x03, 0x64, 0x65, 0x66, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, // header def 0x00, 0x02, // body count 0x00, 0x02, 0x74, 0x6f, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x03, 0x31, 0x32, 0x33, // first body 0x00, 0x02, 0x74, 0x6f, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x05 // second body }, stream.ToArray()); }
private AMFMessage ReadMessage(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.StartObject) throw new JsonReaderException("AMFMessage must be a JSON Object"); AMFMessage message = new AMFMessage(); for (reader.Read(); reader.TokenType != JsonToken.EndObject; reader.Read()) { if (reader.TokenType != JsonToken.PropertyName) throw new JsonReaderException("JSON format error, JSON Object must have property"); string propertyName = (string)reader.Value; switch (propertyName) { case "Version": reader.Read(); if (reader.TokenType != JsonToken.Integer) throw new JsonReaderException("AMFMessage 'Version' must be JSON Number"); message = new AMFMessage(Convert.ToUInt16(reader.Value)); break; case "Bodies": reader.Read(); if (reader.TokenType != JsonToken.StartArray) throw new JsonReaderException("AMFMessage 'Bodies' must be JSON Array"); for (reader.Read(); reader.TokenType != JsonToken.EndArray; reader.Read()) { AMFBody body = serializer.Deserialize<AMFBody>(reader); message.AddBody(body); } break; default: throw new NotSupportedException("AMFMessage dont support property " + propertyName + ", please report this"); break; } } return message; }
public void WriteMessage(AMFMessage amfMessage) { try { base.WriteShort(amfMessage.Version); int headerCount = amfMessage.HeaderCount; base.WriteShort(headerCount); for(int i = 0; i < headerCount; i++) { this.WriteHeader(amfMessage.GetHeaderAt(i), ObjectEncoding.AMF0); } int bodyCount = amfMessage.BodyCount; base.WriteShort(bodyCount); for(int i = 0; i < bodyCount; i++) { ResponseBody responseBody = amfMessage.GetBodyAt(i) as ResponseBody; if (responseBody != null && !responseBody.IgnoreResults) { //Try to catch serialization errors if (this.BaseStream.CanSeek) { long position = this.BaseStream.Position; try { responseBody.WriteBody(amfMessage.ObjectEncoding, this); } catch (Exception exception) { this.BaseStream.Seek(position, SeekOrigin.Begin); //this.BaseStream.Position = position; #if !SILVERLIGHT if (log.IsFatalEnabled) log.Fatal(__Res.GetString(__Res.Amf_SerializationFail), exception); #endif ErrorResponseBody errorResponseBody; if (responseBody.RequestBody.IsEmptyTarget) { object content = responseBody.RequestBody.Content; if (content is IList) content = (content as IList)[0]; IMessage message = content as IMessage; MessageException messageException = new MessageException(exception); messageException.FaultCode = __Res.GetString(__Res.Amf_SerializationFail); errorResponseBody = new ErrorResponseBody(responseBody.RequestBody, message, messageException); } else errorResponseBody = new ErrorResponseBody(responseBody.RequestBody, exception); try { errorResponseBody.WriteBody(amfMessage.ObjectEncoding, this); } #if !SILVERLIGHT catch (Exception exception2) { if (log.IsFatalEnabled) log.Fatal(__Res.GetString(__Res.Amf_ResponseFail), exception2); throw; } #else catch (Exception) { throw; } #endif } } else responseBody.WriteBody(amfMessage.ObjectEncoding, this); } else { AMFBody amfBody = amfMessage.GetBodyAt(i); FluorineFx.Util.ValidationUtils.ObjectNotNull(amfBody, "amfBody"); amfBody.WriteBody(amfMessage.ObjectEncoding, this); } } } #if !SILVERLIGHT catch(Exception exception) { if( log.IsFatalEnabled ) log.Fatal(__Res.GetString(__Res.Amf_SerializationFail), exception); throw; } #else catch (Exception) { throw; } #endif }
private AMFMessage LoadBinMessageIntoAmfMessage(byte[] encodedMessage) { AMFMessage message = null; byte[] buffer = encodedMessage; MemoryStream stream = new MemoryStream(buffer); try { message = new AMFDeserializer(stream).ReadAMFMessage(); } catch (DecoderFallbackException) { stream.Position = 0; object content = new AMFReader(stream) { FaultTolerancy = true }.ReadAMF3Data(); message = new AMFMessage(3); message.AddBody(new AMFBody(string.Empty, string.Empty, content)); } return message; }
object ProcessMessage(AMFMessage amfMessage) { // Apply AMF-based operation selector /* Dictionary<string, string> operationNameDictionary = new Dictionary<string, string>(); foreach (OperationDescription operation in _endpoint.Contract.Operations) { try { operationNameDictionary.Add(operation.Name.ToLower(), operation.Name); } catch (ArgumentException) { throw new Exception(String.Format("The specified contract cannot be used with case insensitive URI dispatch because there is more than one operation named {0}", operation.Name)); } } */ //SessionMode, CallbackContract, ProtectionLevel AMFMessage output = new AMFMessage(amfMessage.Version); for (int i = 0; i < amfMessage.BodyCount; i++) { AMFBody amfBody = amfMessage.GetBodyAt(i); object content = amfBody.Content; if (content is IList) content = (content as IList)[0]; IMessage message = content as IMessage; if (message != null) { //WCF should not assign client id for Flex... if (message.clientId == null) message.clientId = Guid.NewGuid().ToString("D"); //IMessage resultMessage = _endpoint.ServiceMessage(message); IMessage responseMessage = null; CommandMessage commandMessage = message as CommandMessage; if (commandMessage != null && commandMessage.operation == CommandMessage.ClientPingOperation) { responseMessage = new AcknowledgeMessage(); responseMessage.body = true; } else { RemotingMessage remotingMessage = message as RemotingMessage; string operation = remotingMessage.operation; //TODO: you could use an alias for a contract to expose a different name to the clients in the metadata using the Name property of the ServiceContract attribute string source = remotingMessage.source; Type serviceType = TypeHelper.Locate(source); Type contractInterface = serviceType.GetInterface(_endpoint.Contract.ContractType.FullName); //WCF also lets you apply the ServiceContract attribute directly on the service class. Avoid using it. //ServiceContractAttribute serviceContractAttribute = ReflectionUtils.GetAttribute(typeof(ServiceContractAttribute), type, true) as ServiceContractAttribute; if (contractInterface != null) { object instance = Activator.CreateInstance(serviceType); IList parameterList = remotingMessage.body as IList; MethodInfo mi = MethodHandler.GetMethod(contractInterface, operation, parameterList, false, false); //MethodInfo mi = MethodHandler.GetMethod(serviceType, operation, parameterList, false, false); if (mi != null) { //TODO OperationContract attribute to alias it to a different publicly exposed name OperationContractAttribute operationContractAttribute = ReflectionUtils.GetAttribute(typeof(OperationContractAttribute), mi, true) as OperationContractAttribute; if (operationContractAttribute != null) { //mi = MethodHandler.GetMethod(serviceType, operation, parameterList, false, false); ParameterInfo[] parameterInfos = mi.GetParameters(); object[] args = new object[parameterInfos.Length]; parameterList.CopyTo(args, 0); TypeHelper.NarrowValues(args, parameterInfos); object result = mi.Invoke(instance, args); if (!(result is IMessage)) { responseMessage = new AcknowledgeMessage(); responseMessage.body = result; } else responseMessage = result as IMessage; } else responseMessage = ErrorMessage.GetErrorMessage(remotingMessage, new SecurityException("Method in not part of an service contract")); } else responseMessage = ErrorMessage.GetErrorMessage(remotingMessage, new SecurityException("Method in not part of an service contract")); } else responseMessage = ErrorMessage.GetErrorMessage(remotingMessage, new SecurityException(String.Format("The specified contract {0} cannot be used with the source named {1} and operation named {2}", _endpoint.Contract.ContractType.Name, source, operation))); } if (responseMessage is AsyncMessage) { ((AsyncMessage)responseMessage).correlationId = message.messageId; } responseMessage.destination = message.destination; responseMessage.clientId = message.clientId; ResponseBody responseBody = new ResponseBody(amfBody, responseMessage); output.AddBody(responseBody); } } return output; }