Mono 为什么ToOptimizedResult会抛出;请求的功能未实现。”;单声道?
我正在使用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[ListMono 为什么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
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或性能。