servicestack,Iis,Compression,servicestack" /> servicestack,Iis,Compression,servicestack" />

Iis 服务堆栈支持全局压缩

Iis 服务堆栈支持全局压缩,iis,compression,servicestack,Iis,Compression,servicestack,我们使用下面的post在我们的服务堆栈API上启用压缩 我的AppHost文件中包含以下代码: public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext) { return new ApiServiceRunner<TRequest>(this, actionContext); } public overrid

我们使用下面的post在我们的服务堆栈API上启用压缩

我的AppHost文件中包含以下代码:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
    return new ApiServiceRunner<TRequest>(this, actionContext);
}
public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
    bool useCustomRunner = actionContext.RequestType.Name != "HomepageLayoutConfigRequest";

    return useCustomRunner 
        ? new ApiServiceRunner<TRequest>(this, actionContext)
        : base.CreateServiceRunner<TRequest>(actionContext);
}
问题是,这段代码现在在每个响应上都运行,我们有一个端点只从服务器文件系统调用json文件。当代码在这个json文件上运行时,它会完全杀死服务器上的应用程序池,我在调试调用这个json文件的集成测试时看到堆栈溢出异常

因此,我们必须在AppHost文件中添加以下代码:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
    return new ApiServiceRunner<TRequest>(this, actionContext);
}
public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
    bool useCustomRunner = actionContext.RequestType.Name != "HomepageLayoutConfigRequest";

    return useCustomRunner 
        ? new ApiServiceRunner<TRequest>(this, actionContext)
        : base.CreateServiceRunner<TRequest>(actionContext);
}
公共覆盖IServiceRunner CreateServiceRunner(ActionContext ActionContext)
{
bool useCustomRunner=actionContext.RequestType.Name!=“HomepageLayoutConfigRequest”;
返回使用CustomRunner
?新的ApiServiceRunner(此,actionContext)
:base.CreateServiceRunner(actionContext);
}
如您所见,当请求类型名称为HomepageLayoutConfigRequest时,我们不使用自定义的ApiServiceRunner。这很难看,我们需要一个更好的方法

有什么想法吗

谢谢 罗斯

另外,以下是我最新的AppHost CreateServiceRunner覆盖:

    public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
    {
        var requestType = actionContext.RequestType;
        string message  = "The [EnableCompression] attribute exists: {0}";

        Debug.WriteLine(string.Format("The requestType was {0}", requestType));

        var useCustomRunner = requestType.HasAttribute<EnableCompression>();
        Debug.WriteLine(string.Format(message, requestType.HasAttribute<EnableCompression>()));

        #region for serviceType if we ever need it. Currently it doesnt work as the guys at SS say it should
        // https://stackoverflow.com/questions/19127522/service-stack-enable-compression-globally
        // Commented out at there is nothing in the EndpointHost.Metadata so getting a null exception - we only need to use the attribute on the request DTO anyway.

        // @Mythz - the following code is the code that doesnt work as per my comments
        //var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestType);

        // @Mythz- this (serviceType) is always null. It is available in next iteration of debugging (1 iteration behind)
        //if (serviceType != null && !useCustomRunner)
        //{
        //    Debug.WriteLine(string.Format("The serviceType was {0}", serviceType));
        //    useCustomRunner = serviceType.HasAttribute<EnableCompression>();
        //    Debug.WriteLine(string.Format(message, serviceType.HasAttribute<EnableCompression>()));
        //}
        #endregion

        return useCustomRunner
            ? new ApiServiceRunner<TRequest>(this, actionContext)
            : base.CreateServiceRunner<TRequest>(actionContext);
    }
公共覆盖IServiceRunner CreateServiceRunner(ActionContext ActionContext)
{
var requestType=actionContext.requestType;
string message=“存在[EnableCompression]属性:{0}”;
WriteLine(string.Format(“requestType为{0}”,requestType));
var useCustomRunner=requestType.HasAttribute();
Debug.WriteLine(string.Format(message,requestType.HasAttribute());
#服务类型的区域,如果我们需要的话。目前它没有像SS的人说的那样工作
// https://stackoverflow.com/questions/19127522/service-stack-enable-compression-globally
//注释掉了EndpointHost.Metadata中没有任何内容,因此获取空异常-无论如何,我们只需要在请求DTO上使用该属性。
//@Mythz-以下代码与我的评论不符
//var serviceType=EndpointHost.Metadata.GetServiceTypeByRequest(requestType);
//@Mythz-此(serviceType)始终为空。它可在调试的下一次迭代(1次迭代后)中使用
//if(serviceType!=null&!useCustomRunner)
//{
//WriteLine(string.Format(“serviceType是{0}”,serviceType));
//useCustomRunner=serviceType.HasAttribute();
//Debug.WriteLine(string.Format(message,serviceType.HasAttribute());
//}
#端区
返回使用CustomRunner
?新的ApiServiceRunner(此,actionContext)
:base.CreateServiceRunner(actionContext);
}

我认为您的思路是正确的,尽管我更喜欢使用自定义属性,例如,仅对标有
[EnableCompression]
的服务类或请求DTO启用压缩,但您可以执行以下操作:

var serviceType = actionContext.ServiceType;
var requestType = actionContext.RequestType;

var useCustomRunner = serviceType.HasAttribute<EnableCompressionAttribute>()
                   || requestType.HasAttribute<EnableCompressionAttribute>()

return useCustomRunner
    ? new ApiServiceRunner<TRequest>(this, actionContext)
    : base.CreateServiceRunner<TRequest>(actionContext);
var serviceType=actionContext.serviceType;
var requestType=actionContext.requestType;
var useCustomRunner=serviceType.HasAttribute()
||requestType.HasAttribute()
返回使用CustomRunner
? 新的ApiServiceRunner(此,actionContext)
:base.CreateServiceRunner(actionContext);

我个人喜欢
[EnableCompression]
的声明意图,但如果您的ApiServiceRunner最终做的不仅仅是压缩,您还可以使用
[UseCustomRunner]
之类的工具。

嘿,Mythz,这一切看起来都很棒。尽管我在:var serviceType=EndpointHost.Metadata.GetServiceTypeByRequest(requestType)上得到一个空引用;因为EndpointHost.MetaData在其任何集合中都没有任何内容。例如,ServiceTypes集合为空。有什么想法吗?奇怪的是,您的请求和服务名称是否出现在
/operations/metadata
元数据页面中?看起来这里需要什么:var serviceType=EndpointHost.metadata.GetServiceTypeByRequest(requestType);仅在EndpointHost.Metadata中可用。在当前请求之后再向此方法发送一个请求。即。。。有东西加载的顺序不对。好吧,我还在等待更多的帮助来让它工作。我认为@mythz response这是正确的做法,但我遇到了我评论中提到的问题。@RuSs好的,是的,看起来ActionContext在元数据索引建立之前就被缓存了。我刚刚将ServiceType添加到ActionContext中,在下一个周末的版本中将提供该服务。在此之前,您可以使用属性requestdto(或者从src构建v3分支)。我将更新示例以使用ServiceType属性。