Вот простой пример:
using System;
using System.Collections.Generic;
using System.IO;
using Amazon.Lambda.Core;
namespace MySerializer
{
public class LambdaSerializer : ILambdaSerializer
{
public LambdaSerializer()
{
}
public LambdaSerializer(IEnumerable<Newtonsoft.Json.JsonConverter> converters) : this()
{
throw new NotSupportedException("Custom serializer with converters not supported.");
}
string GetString(Stream s)
{
byte[] ba = new byte[s.Length];
for (int iPos = 0; iPos < ba.Length; )
{
iPos += s.Read(ba, iPos, ba.Length - iPos);
}
string result = System.Text.ASCIIEncoding.ASCII.GetString(ba);
return result;
}
public T Deserialize<T>(Stream requestStream)
{
string json = GetString(requestStream);
// Note: you could just pass the stream into the deserializer if it will accept it and dispense with GetString()
T obj = // Your deserialization here
return obj;
}
public void Serialize<T>(T response, Stream responseStream)
{
string json = "Your JSON here";
StreamWriter writer = new StreamWriter(responseStream);
writer.Write(json);
writer.Flush();
}
} // public class LambdaSerializer
}
В вашей лямбда-функции вы получите следующее:
[assembly: LambdaSerializer(typeof(MySerializer.LambdaSerializer))]
namespace MyNamespace
{
public MyReturnObject FunctionHandler(MyInObject p, ILambdaContext context)
{
}
Обратите внимание, что явное выполнение интерфейса не работает: [115 ]
void ILambdaContext.Serialize<T>(T response, Stream responseStream)
{
// won't work
Не спрашивайте меня, почему. Я предполагаю, что AWS создает объект и не приводит его к интерфейсу, а ожидает открытых методов.
На самом деле вы можете найти исходный код сериализатора, но в данный момент я не могу его найти. Если я наткнусь на это, я отредактирую этот пост.
По моему опыту, используется только ctor по умолчанию, но для безопасности вам, вероятно, следует добавить конвертеры по умолчанию в ваш сериализатор. Я не беспокоюсь в настоящее время, и все было в порядке.
Надеюсь, это поможет.
Адам.
Проблема заключалась в том, что я использовал MvcRoute.MappUrl
из MvcContrib
для маршрутизации context.Routes
.
Похоже, что MvcContrib
отображение маршрутизации было неудобно с маршрутизацией по областям.
Добавьте следующий код в Application_Start()
метод в Вашем проекте:
ViewEngines.Engines.Add(new RazorViewEngine());
Скорее всего, вы не создавали собственный механизм просмотра.
Механизм представлений по умолчанию ищет представления в ~ / Views / [Controller] /
и ~ / Views / Shared /
.
Вам необходимо создать свой собственный механизм просмотра, чтобы обеспечить поиск видов в папке просмотра областей.
Посмотрите этот пост Фила Хаака.
Проверьте сгенерированный код по адресу MyAreaAreaRegistration.cs и убедитесь, что параметр controller установлен на ваш контроллер по умолчанию, иначе контроллер будет вызван bot по какой-то причине ASP.NET MVC не будет искать представления в папке area
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"SomeArea_default",
"SomeArea/{controller}/{action}/{id}",
new { controller = "SomeController", action = "Index", id = UrlParameter.Optional }
);
}
Это все еще проблема в финальной версии.. Когда вы создаете область из контекстного меню / Добавить / Область, Visual Studio не помещает Контроллер в последний аргумент метода MapRoute. . Вам нужно позаботиться об этом, и в моем случае мне приходится ставить его вручную каждый раз, когда я создаю новую область.