【问题标题】:Resolving a ServiceStack Service and defining content type解析 ServiceStack 服务并定义内容类型
【发布时间】:2014-07-11 14:50:01
【问题描述】:

我目前正在开发 C# ServiceStack API。

在其中一项服务中,我需要执行另一项服务。我从 Funq 容器解析服务并执行相关方法,但返回的是 json 而不是 .net 对象。

我理解这是因为来自前端的原始请求是针对 json 的内容类型,而默认的内容类型是 json。

有没有一种方法可以解析服务并执行其方法,但改为接收 .net 对象?

【问题讨论】:

    标签: c# json servicestack content-type


    【解决方案1】:

    您可以使用ResolveService<T> 执行并委托给ServiceStack 中的另一个Service,例如:

    从 ServiceStack 服务内部:

    using (var service = base.ResolveService<MyService>())
    {
        var response = service.Get(new MyRequest { ... });
    }
    

    从自定义用户会话内部:

    using (var service = authService.ResolveService<MyService>())
    {
        var response = service.Get(new MyRequest { ... });
    }
    

    从 ServiceStack 外部:

    using (var service = HostContext.ResolveService<MyService>())
    {
        var response = service.Get(new MyRequest { ... });
    }
    

    ServiceStack 服务只是普通的依赖项

    由于 ServiceStack 中的服务就像任何其他 IOC 依赖项一样,ResolveService 的实现只是从 ServiceStack 的 IOC 中解析服务并注入当前请求,即:

    public static T ResolveService<T>(HttpContextBase httpCtx=null) 
        where T : class, IRequiresRequest
    {
        var service = AssertAppHost().Container.Resolve<T>();
        if (service == null) return null;
        service.Request = httpCtx != null 
            ? httpCtx.ToRequest() 
            : HttpContext.Current.ToRequest();
        return service;
    }
    

    【讨论】:

    • 感谢您的及时回复。是的,工作一种享受。我不确定为什么我之前会返回原始 json 内容。也许我没有使用 ResolveService.
    • @Drammy 我假设您通过 HTTP 调用服务,例如使用 JsonServiceClient。
    • 我已经弄清楚我做错了什么——我在服务上调用执行 Get,但传入一个 CachedRequest 对象,希望在可能的情况下命中缓存。因此,我得到了一个 CompressedResult 回来。我应该如何调用解析服务以执行使用缓存的方法?
    猜你喜欢
    • 2016-10-16
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多