【问题标题】:Why does ToOptimizedResult throw "Requested feature is not implemented." on Mono?为什么 ToOptimizedResult 会抛出“请求的功能未实现”。在单声道上?
【发布时间】:2014-01-22 19:21:43
【问题描述】:

我正在使用 Visual Studio 构建我的 ServiceStack 4.0.8 服务。在 Windows 上一切正常,但是当我尝试在带有 NGINX 1.4.1 和 fastcgi-server4 的 Mono 2.10.8.1 / Ubuntu 13.10 上运行时。

我得到一个例外:

请求的功能未实现。 在 System.Web.HttpContextWrapper.GetService (System.Type serviceType) [0x00000] in :0 在 ServiceStack.Host.RequestPreferences.GetWorker(System.Web.HttpContextBase 上下文)[0x00000] 中:0 在 ServiceStack.Host.RequestPreferences.get_HttpWorkerRequest () [0x00000] 在:0 在 ServiceStack.Host.RequestPreferences.get_AcceptEncoding () [0x00000] 在:0 在 ServiceStack.Host.RequestPreferences.get_AcceptsDeflate () [0x00000] 在 ServiceStack.RequestExtensions.GetCompressionType 的 :0 (IRequest 请求)[0x00000] 在:0 在 ServiceStack.RequestExtensions.ToOptimizedResult[List1] (IRequest request, System.Collections.Generic.List1 dto) [0x00000] 在:0 在 Phase1HistoryServer.SymbolsService.Get(Phase1HistoryServer.Symbols 请求)[0x00000] 在:0

如果我直接返回 DTO 对象,我不会收到错误。但是,如果我使用base.Request.ToOptimizedResult,则会发生异常。

List<DataItem> data = new List<DataItem>(); 
data.Add(new dataItem { Data = "fake data" });
return base.Request.ToOptimizedResult<List<DataItem>>(data);

【问题讨论】:

  • 那么您是否使用自托管应用程序并通过 NGINX 转发请求?
  • 不,我使用的是 nginx 和 fastcgi-server4。我处于测试的早期阶段,只有在确认我需要的所有功能都运行良好后,我才会关心如何桥接单声道或性能。

标签: mono servicestack dto


【解决方案1】:

更新:

A commit to ServiceStack 已生成,4.0.16+ 版本不应再出现此异常。


ToOptimizedResult() 有效,这不是 ServiceStack 的缺点,而是 Mono 和 fastcgi-server-4 的缺点。有一个合适的解决方法。

单声道不完整,没有实现System.Web.HttpContextWrapper.GetService

抛出这个异常是因为 Mono 项目还没有实现这个方法。由于 Mono 是一个开源项目,他们必须自己重新创建 .NET 规范,而这种方法根本没有完成。

See here获取相关Mono源代码:

public class HttpContextWrapper : HttpContextBase
{
    ...

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

单声道解决方案,使用自托管应用程序:

我在 Mono (尽管是 v3.2.6) 上运行 ServiceStack,使用 ToOptimizedResult 没有任何问题,但我不使用 fastcgi-server4,它将依赖于 System.Web.HttpContextWrapper

相反,我使用了一个自托管的 ServiceStack 应用程序,它基于底层 System.Net.HttpListener 池,它似乎不受相同问题的影响。因此效果很好。

演示应用:

以下是使用您的测试代码的自托管 ServiceStack 应用程序的代码:

using System;
using ServiceStack;
using System.Collections.Generic;

namespace Testv4
{
    class MainClass
    {
        public static void Main()
        {
            // Very basic console host
            var appHost = new AppHost(500);
            appHost.Init();
            appHost.Start("http://*:8082/");
            Console.ReadKey();
        }
    }

    public class AppHost : AppHostHttpListenerPoolBase
    {
        public AppHost(int poolSize) : base("Test Service", poolSize, typeof(TestApp).Assembly) {}

        public override void Configure(Funq.Container container)
        {
        }
    }

    public static class TestApp
    {
        public class DataItem
        {
            public string Data { get; set; }
        }

        [Route("/Test", "GET")]
        public class TestRequest {}

        public class TestController : Service
        {
            public object Get(TestRequest request)
            {
                var list = new List<DataItem> {
                    new DataItem { Data = "Fake Data" }
                };

                return base.Request.ToOptimizedResult(list);
            }
        }
    }
}

您可以前往localhost:8082/Test 测试应用程序。压缩结果时不应该抛出异常。

自托管应用的可用性:

我的建议是使用 NGINX 的透明代理功能将来自 NGINX 的请求转发到 ServiceStack 应用程序,或者干脆切掉 NGINX 并将请求直接发送到应用程序。

AppHostHttpListenerPoolBase 运行良好,我在生产环境中使用它没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2019-06-16
    • 2018-12-26
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多