标签: servicestack

禁用ASP.NET HttpHandler响应缓存

背景

我正在比较在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.FileChangeEventHandler
  • System.Web.Configuration.MapPathCacheInfos
  • System.Web.CachedPathDatas
  • System.Web.Caching.CacheDependencys
  • System.Web.Caching.CacheEntrys

显然,这些缓存项目让我相信它是一个缓存膨胀问题(我很想摆脱150,000个无法使用的对象!).

到目前为止我尝试过的

  • 在IIS的"HTTP Resonse Headers"中,将"Expire Web content"设置为"Immediate".
  • 在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缓存.

更新#1

通过反射器挖掘我发现将值设置UrlMetadataSlidingExpiration为零消除了过多内存使用的大部分,代价是将吞吐量减少50%(FileAuthorizationModule类缓存FileSecurityDescriptors,生成时必须有些昂贵,UrlMetadataSlidingExpiration是非零).

这是通过更新web.config并将以下内容放入:

<hostingEnvironment urlMetadataSlidingExpiration="00:00:00"/>
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我将尝试完全禁用FileAuthorizationModule运行,看看是否有帮助.但是,ASP.NET仍然会生成2*N MapPathCacheInfoCacheEntry对象,因此内存仍在消耗,速度要慢得多.

更新#2

另一半问题与此处描述的问题相同:阻止许多不同的MVC URL填充ASP.NET缓存.设置

<cache percentagePhysicalMemoryUsedLimit="1" …

asp.net caching httphandler servicestack nancy

18
推荐指数
1
解决办法
4115
查看次数

如何扩展ServiceStack身份验证

我正在使用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表.

authentication servicestack

18
推荐指数
1
解决办法
1万
查看次数

ServiceStack Routing不适用于查询字符串

我有一个使用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的请求成功?

谢谢.

routing servicestack

17
推荐指数
1
解决办法
7929
查看次数

如何在ServiceStack服务实现中使用标准ASP.NET会话对象

我刚刚开始使用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实现,以使工作正常并避免重新处理它在这一点上超过必要的.

asp.net servicestack

16
推荐指数
2
解决办法
6166
查看次数

ServiceStack如何从代码中调用我的服务

我怎么称呼我自己的服务?

我有一项服务,使用其他服务来撰写信息.

我想在此服务的代码中调用其他服务.

我怎样才能做到这一点?

.net c# servicestack

16
推荐指数
1
解决办法
3078
查看次数

ServiceStack剃刀默认页面

说我有2页

  1. /NotADefault.cshtml

  2. /Views/Default.cshtml

问题1.

现在我运行它,A无论我怎么命名,页面总是被隐式调用作为启动默认页面. 只有在我显式调用localhost/View/Default时才会调用
Page B.如何使页面B(View文件夹中的页面)成为我的默认页面?

问题2.

我也有NotADefaultService.csDefaultService.cs.我在后面为每个页面提供了一个Service类.但是,当A调用页面时,NotADefaultService.cs永远不会被调用.只有DefaultService.cs在调用页面时B才会调用...

我的观察是,只有View文件夹中的页面才能使其后端服务类正常工作.在View文件夹之外它不起作用.

结合Q1和Q2.

我如何能:

选项1.让后端服务类在/ root"View"文件夹外部工作?

要么

选项2./View/Default.schtml在启动时指定可以命中服务类的默认值?

c# servicestack

16
推荐指数
1
解决办法
7199
查看次数

ServiceStack如何处理并发调用?

ServiceStack如何处理并发调用?我在WCF中寻找相当于ConcurrencyMode.Multiple的东西.

我的WCF服务设置了此属性:

   [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
Run Code Online (Sandbox Code Playgroud)

我是否需要在ServiceStack中启用任何内容以使其为每个调用使用多个线程?

c# rest servicestack

16
推荐指数
1
解决办法
3764
查看次数

ServiceStack验证并不总是被激活

所以我试图用RavenDB和ServiceStack构建一个End To End集成测试套件,但是我遇到了一个非常奇怪的问题,即验证不能在某些请求上运行.这真的很奇怪,我不确定我做错了什么.我正在使用NCrunch.有时测试通过,有时它会失败.

希望这是一个简单的解决方案,我正在做的事情.

您可以在http://github.com/khalidabuhakmeh/endtoend上下载整个项目

除了VS2012和NuGet Package Restore之外,您不需要任何其他功能.

更新:我决定在NCrunch和Resharper Test Runner中运行它,两者都给出相同的结果[见下图].

更新更新:我认为它可能是XUnit,所以我尝试使用NUnit.不,还是同样的问题.

从NCrunch和Resharper测试运行

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

试运行2

最新更新: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)

.net c# servicestack

16
推荐指数
1
解决办法
1369
查看次数

如何在fiddler中撰写REST Web方法的请求

我可以调用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)

rest web-services fiddler servicestack

16
推荐指数
1
解决办法
5万
查看次数

ServiceStack - 有没有办法强制所有序列化日期使用特定的DateTimeKind?

我有一个像这样的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 - 这是有效的 - 但我希望有一些不易出错的东西.

c# servicestack servicestack-text

16
推荐指数
3
解决办法
8191
查看次数