我正在比较在IIS 7下运行的NancyFx和ServiceStack.NET的性能(在Windows 7主机上进行测试).两者都非常快 - 在本地测试每个框架进程超过10,000 req/sec,ServiceStack的速度提高了约20%.
我遇到的问题是ASP.NET似乎正在缓存来自HttpHandler的每个唯一URI请求的响应,很快导致大量内存压力(3 GB以上)和垃圾收集器过度工作(大约25%的时间消耗GC).到目前为止,我一直无法禁用对象的缓存和构建,并且正在寻找有关如何禁用此行为的建议.
请求循环基本如下:
for i = 1..100000:
string uri = http://localhost/users/{i}
Http.Get(uri)
Run Code Online (Sandbox Code Playgroud)
响应是一个简单的JSON对象,格式为{UserID:n}.
我已经破解了打开的WinDBG,并且每个请求都有:
System.Web.FileChangeEventHandlerSystem.Web.Configuration.MapPathCacheInfosSystem.Web.CachedPathDatasSystem.Web.Caching.CacheDependencysSystem.Web.Caching.CacheEntrys显然,这些缓存项目让我相信它是一个缓存膨胀问题(我很想摆脱150,000个无法使用的对象!).
在web.config中
<system.web>
<caching>
<outputCache enableOutputCache="false" enableFragmentCache="false"/>
</caching>
</system.web>
Run Code Online (Sandbox Code Playgroud)同样在web.config中(以及策略的许多变体,包括无).
<caching enabled="false" enableKernelCache="false">
<profiles>
<add policy="DontCache" kernelCachePolicy="DontCache" extension="*/>
</profiles>
</caching>
Run Code Online (Sandbox Code Playgroud)查看框架的源代码,看看是否可能存在使用ASP.NET缓存的任何"功能".虽然有缓存帮助程序,但它们对框架本身是私有的,并且似乎不利用ASP.NET缓存.
通过反射器挖掘我发现将值设置UrlMetadataSlidingExpiration为零消除了过多内存使用的大部分,代价是将吞吐量减少50%(FileAuthorizationModule类缓存FileSecurityDescriptors,生成时必须有些昂贵,UrlMetadataSlidingExpiration是非零).
这是通过更新web.config并将以下内容放入:
<hostingEnvironment urlMetadataSlidingExpiration="00:00:00"/>
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我将尝试完全禁用FileAuthorizationModule运行,看看是否有帮助.但是,ASP.NET仍然会生成2*N MapPathCacheInfo和CacheEntry对象,因此内存仍在消耗,速度要慢得多.
另一半问题与此处描述的问题相同:阻止许多不同的MVC URL填充ASP.NET缓存.设置
<cache percentagePhysicalMemoryUsedLimit="1" …
我正在使用ServiceStack身份验证和ServiceStack.OrmLite(SqlServer).我有不同的用户类型,如学生,教师,校长.所有用户类型将与其他Db表有关系.实施它的最佳做法是什么?
A)向UserAuth表添加必要的字段并制作Black Magic.(创建UserAuth后,手动向表中添加必要的额外信息)
B)学生:UserAuth(将克隆UserAuth中的所有字段)
C)Student.UserAuthId,UserAuth.Meta [UserType.Student,StudentId]互引用
D)扩展XService,XFeature或??
PS:如何将所有者和类型字段添加到ServiceStack UserAuth表.
我有一个使用ServiceStack构建的简单REST服务.
如果我配置这样的路线:
//register user-defined REST-ful urls
Routes
.Add<Contact>("/Contacts")
.Add<Contact>("/Contacts/{ContactId}")
Run Code Online (Sandbox Code Playgroud)
此请求成功.
http://<server>:59557/Contacts?ContactId=9999 //Works
Run Code Online (Sandbox Code Playgroud)
如果我配置这样的路由(业务分析师更喜欢生成的元数据)
//register user-defined REST-ful urls
Routes
.Add<UpdateContact>("/UpdateContact", "PUT")
.Add<CreateContact>("/CreateContact", "POST")
.Add<GetContact>("/Contacts/{ContactId}", "GET")
http://<server>:59557/Contacts/9999 //Works
http://<server>:59557/Contacts?ContactId=9999 //Fails, Handler for request not found
Run Code Online (Sandbox Code Playgroud)
如何在第二个样本中配置路由,以便对/ Contacts?ContactId = 9999的请求成功?
谢谢.
我刚刚开始使用ServiceStack,作为测试用例,我希望重新编写使用标准ASP.Net处理程序构建的现有服务.我已经成功地将它全部工作,因为我想要它,但有某些方面利用ASP.Net Session对象.
我已经尝试将IRequiresSessionState添加到服务接口中:
public class SessionTestService : RestServiceBase<SessionTest>, IRequiresSessionState {
public override object OnPost(SessionTest request) {
// Here I want to use System.Web.HttpContext.Current.Session
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我似乎无法使其工作,因为Session对象始终为null.
我做了很多谷歌搜索,并对https://github.com/mythz/ServiceStack/blob/master/tests/ServiceStack.WebHost.IntegrationTests/Services/Secure.cs和类似问题感到困惑,但我找不到任何执行此操作的示例代码(令我感到惊讶).任何人都可以解释为什么以上不起作用,并建议我需要做什么才能使它工作?
注意:最终我可能希望用Redis替换它或者尝试删除任何服务器端会话要求,但我认为我暂时使用ASP.Net实现,以使工作正常并避免重新处理它在这一点上超过必要的.
我怎么称呼我自己的服务?
我有一项服务,使用其他服务来撰写信息.
我想在此服务的代码中调用其他服务.
我怎样才能做到这一点?
说我有2页
/NotADefault.cshtml
/Views/Default.cshtml
问题1.
现在我运行它,A无论我怎么命名,页面总是被隐式调用作为启动默认页面.
只有在我显式调用localhost/View/Default时才会调用
Page B.如何使页面B(View文件夹中的页面)成为我的默认页面?
问题2.
我也有NotADefaultService.cs和DefaultService.cs.我在后面为每个页面提供了一个Service类.但是,当A调用页面时,NotADefaultService.cs永远不会被调用.只有DefaultService.cs在调用页面时B才会调用...
我的观察是,只有View文件夹中的页面才能使其后端服务类正常工作.在View文件夹之外它不起作用.
结合Q1和Q2.
我如何能:
选项1.让后端服务类在/ root"View"文件夹外部工作?
要么
选项2./View/Default.schtml在启动时指定可以命中服务类的默认值?
ServiceStack如何处理并发调用?我在WCF中寻找相当于ConcurrencyMode.Multiple的东西.
我的WCF服务设置了此属性:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
Run Code Online (Sandbox Code Playgroud)
我是否需要在ServiceStack中启用任何内容以使其为每个调用使用多个线程?
所以我试图用RavenDB和ServiceStack构建一个End To End集成测试套件,但是我遇到了一个非常奇怪的问题,即验证不能在某些请求上运行.这真的很奇怪,我不确定我做错了什么.我正在使用NCrunch.有时测试通过,有时它会失败.
希望这是一个简单的解决方案,我正在做的事情.
您可以在http://github.com/khalidabuhakmeh/endtoend上下载整个项目
除了VS2012和NuGet Package Restore之外,您不需要任何其他功能.
更新:我决定在NCrunch和Resharper Test Runner中运行它,两者都给出相同的结果[见下图].
更新更新:我认为它可能是XUnit,所以我尝试使用NUnit.不,还是同样的问题.

**另一个更新:根据user1901853的请求输入控制台写入.这就是结果."

最新更新:RequestFilters正在逐渐消失,我不知道为什么.看起来它可能是一个线程问题,但我看不到在哪里.
我的AppHost正在使用AppHostListenerBase.
using EndToEnd.Core;
using Funq;
using Raven.Client;
using ServiceStack.ServiceInterface.Validation;
using ServiceStack.WebHost.Endpoints;
namespace EndToEnd
{
public class TestAppHost
: AppHostHttpListenerBase
{
private readonly IDocumentStore _documentStore;
public TestAppHost(IDocumentStore documentStore)
: base("Test AppHost Api", typeof(TestAppHost).Assembly)
{
_documentStore = documentStore;
}
public override void Configure(Container container)
{
ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;
// Register RavenDB things
container.Register(_documentStore);
container.Register(c =>
{
var db = c.Resolve<IDocumentStore>();
return db.OpenSession();
}).ReusedWithin(ReuseScope.Request);
Plugins.Add(new ValidationFeature());
container.RegisterValidators(typeof(CreateWidgetValidator).Assembly); …Run Code Online (Sandbox Code Playgroud) 我可以调用web服务但名称属性不绑定.
提琴手请求
POST http://localhost:50399/api/custservice/ HTTP/1.1
User-Agent: Fiddler
Host: localhost: 50399
Content-Length: 28
{ "request": { "name":"test"}}
Run Code Online (Sandbox Code Playgroud)
POST Webmethod
public string Any(CustomerRequest request)
{
//return details
}
Run Code Online (Sandbox Code Playgroud)
CustomerRequest.cs
public class CustomerRequest
{
public string name {get;set;}
}
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的POCO:
public class BlogEntry
{
public string Title { get; set; }
public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
大部分时间它都是从Entity Framework中提取的,但它可以并且将在Entity Framework之外使用.
来自EF的日期的DateTimeKind是未指定的,从我读到的是正常的.
当我在Redis中缓存此POCO(使用ServiceStack Redis客户端)时,它返回DateTimeKind of Local.
因此返回的对象存在抖动.第一遍(未缓存)具有ISO-8061,没有偏移(DateTimeKind.Unspecified).第二遍(缓存)是带有偏移的ISO-8061(来自Redis with DateTimeKind.Local).
是否有任何方法可以强制ServiceStack JSON序列化程序始终将日期解释为给定的DateTimeKind?(我知道有一个"JsConfig.AppendUtcOffset"属性,但无论是真还是假,价值观永远不会改变?)
或者在我的类型化RedisClient的反序列化过程中的某个地方使DateTimeKind本地?
我可以手动更改我的POCO来强制执行DateTimeKind - 这是有效的 - 但我希望有一些不易出错的东西.
servicestack ×10
c# ×5
.net ×2
asp.net ×2
rest ×2
caching ×1
fiddler ×1
httphandler ×1
nancy ×1
routing ×1
web-services ×1