хитрость заключается в том, чтобы использовать FluorineFx.IO.AMFMessage
с AMFBody в качестве объекта результата и установить Content
Недвижимость.
Вы можете увидеть это в Чарльз прокси с другими рабочими примерами (я использовал большой WebORB examples, в частности Flash remoting Basic Invocation AS3)
Я обновил AMFFilter для поддержки Response
параметра, который нуждается в AMFBody. Возможно, его можно было бы более изящно решить каким-то текущим кэшем контекста, не знаю.
код следующим образом:
public class AmfResult : ActionResult
{
private readonly object _o;
private readonly string _response;
public AmfResult(string response, object o)
{
_response = response;
_o = o;
}
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.ContentType = "application/x-amf";
var serializer = new AMFSerializer(context.HttpContext.Response.OutputStream);
var amfMessage = new AMFMessage();
var amfBody = new AMFBody();
amfBody.Target = _response + "/onResult";
amfBody.Content = _o;
amfBody.Response = "";
amfMessage.AddBody(amfBody);
serializer.WriteMessage(amfMessage);
}
}
Для этого на работу, вам нужно украсить метод на контроллере с AMFFilter
public class AMFFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType == "application/x-amf")
{
var stream = filterContext.HttpContext.Request.InputStream;
var deserializer = new AMFDeserializer(stream);
var message = deserializer.ReadAMFMessage();
var body = message.Bodies.First();
filterContext.ActionParameters["target"] = body.Target;
filterContext.ActionParameters["args"] = body.Content;
filterContext.ActionParameters["response"] = body.Response;
base.OnActionExecuting(filterContext);
}
}
}
, который будет выглядеть как этот
[AMFFilter]
[HttpPost]
public ActionResult Index(string target, string response, object[] args)
{
// assume target == "TestMethod" and args[0] is a String
var message = Convert.ToString(args[0]);
return new AmfResult(response, "Echo " + message);
}
Client боковой код для справки
//Connect the NetConnection object
var netConnection: NetConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
netConnection.connect("http://localhost:27165/Home/Index");
//Invoke a call
var responder : Responder = new Responder(handleRemoteCallResult, handleRemoteCallFault);
netConnection.call('TestMethod', responder, "Test");
private function onNetStatus(event:NetStatusEvent):void {
log(ObjectUtil.toString(event.info));
}
private function handleRemoteCallFault(...args):void {
log(ObjectUtil.toString(args));
}
private function handleRemoteCallResult(message:String):void {
log(message);
}
private static function log(s:String):void {
trace(s);
}
Если вы хотите, чтобы вернуть ошибку, просто измените эту строку в AMFResult
amfBody.Target = _response + "/onFault";
Мне нравится ObjectUtil.toString форматирование(), но просто удалить его, если вам не Flex связаны между собой.
Кстати, вам это действительно нужно в ASP.NET MVC? Может быть, простой обработчик ASHX будет достаточным, и производительность будет лучше, я не знаю. Архитектура MVC является плюсом, который я предполагаю.
должен ждать 5 часов, чтобы наградить награду – Omu
не знаю, никогда не использовал ashx, я использовал много asp.net mvc – Omu
@ ЧакНоррис меня тоже. возможно, я отправлю его как вопрос, мне также интересно (производительность/архитектурные преимущества обработчика против полного MVC при использовании двоичного AMF) –