解析 ServiceStack 服务并定义内容类型

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 回来。我应该如何调用解析服务以执行使用缓存的方法?

以上是关于解析 ServiceStack 服务并定义内容类型的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack.Text JsonSerializer 无法反序列化其自己的序列化模式(类型定义应以 '' SerializationException 开头)

ServiceStack v4 中服务的 Db 为空

ServiceStack.RabbitMQ在站点中使用时导致静态页面无法正常解析

Servicestack导致承载令牌无效

ServiceStack.OrmLite 入门

让 ServiceStack 保留类型信息