【问题标题】:Self Hosted ServiceStack service for testing is missing metadata用于测试的自托管 ServiceStack 服务缺少元数据
【发布时间】:2013-05-31 19:40:20
【问题描述】:

我一直在遵循各种示例来运行我的服务,并且通过 IIS,我现在看到了一个元数据页面,其中列出了我的服务。但我也希望能够以自托管模式运行服务以进行自动化测试。我已将 ServiceModel 类与 Service 类分开到一个单独的程序集中,以便在没有我的服务的情况下更轻松地分发 ServiceModel 库。

这是 DTO 声明的一个示例:

[Api("GET or DELETE a single folder by id.  Use POST to create a new Folder and PUT or PATCH to update it")]
[Route("/folders", "POST, PUT, PATCH")]
[Route("/folders/{Id}")]
public class Folder : IHasGuidId
{

这是FolderService的开头:

public class FolderService : Service
{
    public FolderResponse Get(Folder folder)
    {

将此 AppHost 与 IIS 结合使用,我看到我的 FolderService 列在 /metadata 下。

internal class AtlasAppHost : AppHostBase
{
    public AtlasAppHost() : base("API v3.0", typeof(FolderService).Assembly)
    {
    }

    public override void Configure(Container container)
    {
        container.Adapter = new StructureMapContainerAdapter();
        AtlasInit(Config);
    }

    internal void AtlasInit(EndpointHostConfig config)
    {
        JsConfig.ExcludeTypeInfo = true;
        JsConfig.DateHandler = JsonDateHandler.ISO8601;
        JsConfig.EmitCamelCaseNames = true;
        config.EnableFeatures = Feature.All.Remove(Feature.Jsv | Feature.Soap | Feature.Csv);
    }
}

但是,使用下面的IntegrationTestBase,当我暂停调试器时,我在/metadata 下看不到我的FolderService,并且请求总是返回NotFound

[TestFixture]
public class ApiIntegrationTestBase
{
    private TestAppHost _appHost;
    protected const string TestServiceUrl = "http://localhost:9755/";

    [TestFixtureSetUp]
    public void TestFixtureSetUp()
    {
        _appHost = new TestAppHost();
        _appHost.Init();
        _appHost.Start(TestServiceUrl);
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        _appHost.Dispose();
    }

    public class TestAppHost : AppHostHttpListenerBase
    {
        public TestAppHost()
            : base("Test App Host", typeof(FolderService).Assembly)
        {
        }

        public override void Configure(Container container)
        {
            var atlasAppHost = new AtlasAppHost();
            atlasAppHost.Configure(container);
            atlasAppHost.AtlasInit(Config);
            Routes.AddFromAssembly(typeof (FolderService).Assembly);
        }
    }
}

为了让我的FolderService 出现在自托管测试程序集中,我是否遗漏了什么?

谢谢!

【问题讨论】:

  • 我想知道,当你自己托管时,你的配置文件中是否必须有 ServiceStackHttpHandlerFactory ?

标签: servicestack


【解决方案1】:

在您的 AppHosts 的构造函数中,您指向 2 个不同的程序集:

public AtlasAppHost() : base("API v3.0", typeof(FolderService).Assembly) {}

public TestAppHost() : base("Test App Host", typeof(AtlasAppHost).Assembly) {}

默认情况下,只有存在于这些程序集中的IService 会被注册和自动连接。

注意:您可以在基本 AppHost 构造函数中提供多个程序集,有关详细信息,请参阅Modularizing Services 上的 wiki。

【讨论】:

  • 不错的收获。但这些类实际上在同一个程序集中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多