servicestack,dto,Mono,servicestack,Dto" /> servicestack,dto,Mono,servicestack,Dto" />

Mono 为什么ToOptimizedResult会抛出;请求的功能未实现。”;单声道?

Mono 为什么ToOptimizedResult会抛出;请求的功能未实现。”;单声道?,mono,servicestack,dto,Mono,servicestack,Dto,我正在使用Visual Studio构建ServiceStack 4.0.8服务。在Windows上,一切都可以完美运行,但当我尝试在Mono 2.10.8.1/Ubuntu 13.10上运行NGINX 1.4.1和fastcgi-server4时 我得到一个例外: 请求的功能未实现。 位于:0中的System.Web.HttpContextWrapper.GetService(System.Type serviceType)[0x00000]处 在ServiceStack.Host.Reque

我正在使用Visual Studio构建ServiceStack 4.0.8服务。在Windows上,一切都可以完美运行,但当我尝试在Mono 2.10.8.1/Ubuntu 13.10上运行NGINX 1.4.1和fastcgi-server4时

我得到一个例外:

请求的功能未实现。 位于:0中的System.Web.HttpContextWrapper.GetService(System.Type serviceType)[0x00000]处 在ServiceStack.Host.RequestPreferences.GetWorker(System.Web.HttpContextBase上下文)[0x00000]中:0 在ServiceStack.Host.RequestPreferences.get\u HttpWorkerRequest()[0x00000] 在ServiceStack.Host.RequestPreferences.get_AcceptEncoding()[0x00000]处的:0中 在ServiceStack.Host.RequestPreferences.get_AcceptsFlate()[0x00000]处的:0中 in:0位于ServiceStack.RequestExtensions.GetCompressionType(IRequest请求)[0x00000] 在ServiceStack.RequestExtensions.ToOptimizedResult[List
1](IRequest请求,System.Collections.Generic.List
1 dto)[0x00000]中输入:0 in:0位于Phase1HistoryServer.SymbolsService.Get(Phase1HistoryServer.Symbols请求)[0x00000]in: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);
列表数据=新列表();
data.Add(新数据项{data=“fake data”});
返回base.Request.ToOptimizedResult(数据);
更新: 已创建,版本4.0.16+不应再出现此异常


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

Mono不完整,未实现
System.Web.HttpContextWrapper.GetService
: 引发此异常是因为Mono项目尚未实现此方法。由于Mono是一个开源项目,他们必须自己重新创建.NET规范,而这种方法根本没有完成

有关Mono源代码:

public class HttpContextWrapper : HttpContextBase
{
    ...

    [MonoTODO]
    public override object GetService (Type serviceType)
    {
        throw new NotImplementedException ();
    }
}
Mono解决方案,使用自托管应用程序: 我在Mono上运行ServiceStack(尽管是v3.2.6),使用
ToOptimizedResult
没有任何问题,但我没有使用
fastcgi-server4
,它依赖于
System.Web.HttpContextWrapper

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

演示应用程序: 以下是使用测试代码运行的自托管ServiceStack应用程序的代码:

使用系统;
使用ServiceStack;
使用System.Collections.Generic;
命名空间Testv4
{
类主类
{
公共静态void Main()
{
//非常基本的控制台主机
var-appHost=新的appHost(500);
appHost.Init();
appHost.Start(“http://*:8082/”;
Console.ReadKey();
}
}
公共类AppHost:AppHostHttpListenerPoolBase
{
公共AppHost(intPoolSize):基本(“测试服务”、池大小、类型(TestApp.Assembly){}
公共覆盖无效配置(Funq.Container)
{
}
}
公共静态类TestApp
{
公共类数据项
{
公共字符串数据{get;set;}
}
[路线(“/Test”,“GET”)]
公共类TestRequest{}
公共类TestController:服务
{
公共对象获取(TestRequest)
{
变量列表=新列表{
新数据项{Data=“Fake Data”}
};
返回base.Request.ToOptimizedResult(列表);
}
}
}
}
您可以通过转到
localhost:8082/test
来测试应用程序。压缩结果时不应抛出异常

自托管应用程序可用性: 我的建议是使用NGINX的透明代理功能将来自NGINX的请求转发到ServiceStack应用程序上,或者干脆删除NGINX,让请求直接发送到应用程序


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

那么您是否使用自托管应用程序并通过NGINX转发请求?不,我使用的是NGINX和fastcgi-server4。我正处于测试的早期阶段,只有在确认我需要的所有功能都正常工作后,我才会关心如何连接到mono或性能。