Кэширование ServiceStack работает в VS2012, но не в Xamarin Studio 4.2.3 (сборка 60)

Мое приложение выполняет AJAX-вызов маршрута /{Lang}/cook для получения обработанного партиала Razor.

В VS2012 через Cassini я могу получить ответ;

Однако в Xamarin 4.2.3 (сборка 60) я получаю следующую ошибку: Не удалось загрузить ресурс: сервер ответил со статусом 405 (NotImplementedException)

http://127.0.0.1:8080/en-us/cook

Любые идеи, почему маршрут работает в одной IDE, но не в другой?

Я использую сервисный стек 4.0.12.0 с кэшированием в памяти. Система работает в бесплатном/оценочном режиме.

Вот метод службы, который использует кэширование:

Внутри открытого класса ScenarioService: Service

[DefaultView("cook")]
public object Get(CookScenario request)
{
    var cacheKey = GetCacheKey ("cook", request.Lang);

    return base.Request.ToOptimizedResultUsingCache (base.Cache, cacheKey, () => {
        CookScenarioResponse response = LoadJson<CookScenarioResponse>(request.Lang, "cook");
        return response;
    });
}

Внутри AppHost.cs

public override void Configure(Funq.Container container)
{
    //Set JSON web services to return idiomatic JSON camelCase properties
    ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

    //Configure User Defined REST Paths

    container.Register<ICacheClient>(new MemoryCacheClient());

    this.GlobalRequestFilters.Add((request, response, requestDto) =>
    {

         var localizedReq = requestDto as LocalizedRequest;
         if (localizedReq != null)
         {
             Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo(localizedReq.Lang);
         }

    });
    Plugins.Add(new RazorFormat());

}

EDIT: я попытался удалить ToOptimizedResultUsingCaching, и служба для "/en-us/cook" работала нормально; поэтому проблема определенно связана с ToOptimizedResultUsingCaching в стеке служб 4.0.12.0 в Xamarin Studio 4.2.3 (сборка 60) в Mac OS 10.7.5.

Вот информация о моноверсии: компилятор Mono JIT версии 3.2.6 ((no/9b58377 Thu 16 января 17:49:56 EST 2014)

Решение от 27 марта 2014 г., 13:00 по тихоокеанскому времени

После того, как я получил предварительную версию (4.0.16) ServiceStack, я смог подтвердить, что кэширование в памяти теперь работает на Xamarin 4.2.3 (сборка 60) на моем ноутбуке Macbook pro (OSX 10.7.5).

Спасибо еще раз за помощь!


person Abe    schedule 26.03.2014    source источник


Ответы (1)


Я считаю, что ошибка, которую вы видите, является недостатком Mono и узла XSP/fastcgi-server-4, который используется Xamarin Studio.

Раньше я сталкивался с той же проблемой, когда методы ToOptimizedResult/ToOptimizedResultUsingCache не работали, потому что они полагаются на вызов System.Web.HttpContextWrapper.GetService, который не был реализован в Mono.

см. здесь для соответствующего исходного кода Mono:

public class HttpContextWrapper : HttpContextBase
{
    ...

    [MonoTODO]
    public override object GetService (Type serviceType)
    {
        throw new NotImplementedException ();
    }
}

Я обнаружил, что единственный способ обойти эту проблему с Mono — это использовать приложение Self Hosted ServiceStack, потому что оно использует System.Net.HttpListener, которое не страдает от этой проблемы. см. мой предыдущий ответ по этому вопросу, в котором это описано более подробно.


Исправить:

Для решения этой проблемы была сделана фиксация в ServiceStack, и она будет исправлена ​​в версия 4.0.16

person Scott    schedule 26.03.2014
comment
Вау, это здорово. Да, я пытался запустить проект в Xamarin Studio на своем MacBook Pro. Я не мог понять, почему ToOptimizedResultUsingCache работал только на моем ноутбуке с Windows 7 и Visual Studio 2012. - person Abe; 27.03.2014
comment
Есть ли способ использовать кэширование без использования ToOptimizedResultUsingCache в ServiceStack 4? У моей компании есть коммерческая лицензия, и они являются магазином Mac. Однако мы развертываем код из Jenkins, работающего в Windows, в облачных службах Azure. - person Abe; 27.03.2014
comment
@Abe Я изучил это и думаю, что мы сможем решить эту проблему. Я отправляю исправление в ServiceStack, тем временем я нашел решение для обхода ToOptimizedResult. - person Scott; 27.03.2014
comment
Спасибо, Скотт, я также поднял этот вопрос в @ServiceStack, и Демис опубликовал обновленную информацию по адресу github.com/ Стек служб/стек служб/фиксация/ - person Abe; 27.03.2014
comment
@Abe Теперь проблема должна быть решена в следующей сборке ServiceStack. Поскольку фиксация была сделана для предотвращения исключения. - person Scott; 27.03.2014
comment
Скотт, большое спасибо за вашу помощь; это определенно сэкономило как минимум месяц работы. - person Abe; 27.03.2014