首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.IO.InvalidDataException :已设置ServiceStackHost.Instance (BasicAppHost)

System.IO.InvalidDataException :已设置ServiceStackHost.Instance (BasicAppHost)
EN

Stack Overflow用户
提问于 2017-07-18 21:48:47
回答 1查看 503关注 0票数 3

当我尝试在我的servicestack web服务上运行一些测试时,我得到了一个错误。我使用的是ServiceStack 4.5.8和Nunit 3.5。该解决方案最初是从ServiceStackVS模板创建的。

在许多测试中出现的错误是

代码语言:javascript
复制
   System.IO.InvalidDataException : ServiceStackHost.Instance has already been set (BasicAppHost)</br>
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.</br>
   at ServiceStack.ServiceStackHost.Init()</br>
   at MyApp.Tests.EchoServiceUnitTests.OneTimeSetup() in </br>
C:\Repos\MyApp\Myapp\MyApp.Tests\EchoServiceUnitTests.cs:line 45 </br>
--TearDown</br>
   at MyApp.Tests.EchoServiceUnitTests.TestFixtureTearDown() in </br>C:\Repos\MyApp\MyApp\MyApp.Tests\EchoServiceUnitTests.cs:line 54

经常生成此错误的测试之一是

代码语言:javascript
复制
namespace Tests
{

    [TestFixture]
    public class EchoServiceUnitTests
        {

            private ServiceStackHost appHost;

            [OneTimeSetUp]
            public void OneTimeSetup()
                {
                    this.appHost = new  BasicAppHost(typeof(EchoService).Assembly).Init();
                }


            [OneTimeTearDown]
            public void TestFixtureTearDown()
                {
                    this.appHost.Dispose();

                }


            [Test]
            public void TestService()
                {
                    const string Message = "Hello";

                    var service = this.appHost.Container.Resolve <EchoService>();

                    var response = (EchoResponse)service.Any(new Echo
                                                                 {
                                                                     Message = Message
                                                                 });

                    Assert.That(response.Message,
                                Is.EqualTo(Message));
                }
        }
}

为此提供的服务是

代码语言:javascript
复制
namespace ServiceInterface
{

    public class EchoService : Service
        {
              public object Any(Echo request)
                {
                    return new EchoResponse {Message = request.Message};
                }
      }
}

[Route("/Echo")]
[Route("/Echo/{Message}")]
public class Echo : IReturn<EchoResponse>
{

    public string Message { get; set; }

}

    public class EchoResponse : IHasResponseStatus
{
       public EchoResponse()
    {
        this.ResponseStatus = new ResponseStatus();
    }

    public string Message { get; set; }

    public ResponseStatus ResponseStatus { get; set; }

}

最后是我的药剂师

代码语言:javascript
复制
namespace MyApplication
{
    using System;

    using Funq;

    using ServiceInterface;
    using ServiceModel.Validators;

    using ServiceStack;
    using ServiceStack.Admin;
    using ServiceStack.Api.Swagger;
    using ServiceStack.Caching;
    using ServiceStack.Configuration;
    using ServiceStack.Logging;
    using ServiceStack.Logging.NLogger;
    using ServiceStack.MsgPack;
    using ServiceStack.OrmLite;
    using ServiceStack.OrmLite.SqlServer.Converters;
    using ServiceStack.ProtoBuf;
    using ServiceStack.Razor;
    using ServiceStack.Validation;
    using ServiceStack.VirtualPath;
    using ServiceStack.Wire;


    public class AppHost : AppHostBase
        {

            public static ILog Log = LogManager.GetLogger(typeof(AppHost));

                public AppHost()
                : base("MyApp",
                       typeof(HelloService).Assembly) { }


            public override void Configure(Container container)
                {
                    LogManager.LogFactory = new NLogFactory();

                    Log = LogManager.GetLogger(this.GetType());

                    this.Plugins.Add(new RazorFormat());

                    this.Plugins.Add(new PostmanFeature());

                    this.Plugins.Add(new SwaggerFeature());

                    this.Plugins.Add(new AdminFeature());

                    var ormSettings = new AppSettings();

                    container.Register <ICacheClient>(new MemoryCacheClient());

                    var dbFactory = new OrmLiteConnectionFactory(ormSettings.GetString("SqlDbConnection"),
                                                                 SqlServerDialect.Provider);


                    dbFactory.RegisterConnection("Database2",
                                                 ormSettings.GetString("Sql2Connection"),
                                                 SqlServerDialect.Provider);

        SqlServerDialect.Provider.RegisterConverter<DateTime?>(new SqlServerDateTimeConverter());

        this.Plugins.Add(new RequestLogsFeature
                                         {
                                             RequestLogger = new CsvRequestLogger(files: new FileSystemVirtualPathProvider(this,
                                                                                                                           this.Config.WebHostPhysicalPath),
                                                                                  requestLogsPattern: "requestlogs/{year}-{month}/{year}-{month}-{day}.csv",
                                                                                  errorLogsPattern: "requestlogs/{year}-{month}/{year}-{month}-{day}-errors.csv",
                                                                                  appendEvery: TimeSpan.FromSeconds(1)),
                                             EnableRequestBodyTracking = true,
                                             EnableResponseTracking = true,
                                             EnableErrorTracking = true,
                                         });

                    this.Plugins.Add(new AutoQueryDataFeature
                                         {
                                             MaxLimit = 1000
                                         });

                    this.Plugins.Add(new AutoQueryFeature());

                    var sse = new ServerEventsFeature
                                  {
                                      StreamPath = "/event-stream",

                                      HeartbeatPath = "/event-heartbeat",

                                      UnRegisterPath = "/event-unregister",

                                      SubscribersPath = "/event-subscribers",

                                      LimitToAuthenticatedUsers = false,

                                      IdleTimeout = TimeSpan.FromSeconds(30),

                                      HeartbeatInterval = TimeSpan.FromSeconds(10),

                                      NotifyChannelOfSubscriptions = true,
                                  };

                    this.Plugins.Add(sse);
                    Plugins.Add(new AdminFeature());

                    Plugins.Add(new WireFormat());
                    Plugins.Add(new MsgPackFormat());
                    Plugins.Add(new ProtoBufFormat());

                }
        }
}

我尝试了各种建议,包括将测试中的apphost设置为静态,但似乎没有一种建议对我有效。然后我尝试了下面的测试,它也产生了相同的错误,这表明在apphost中有一些错误,但我看不到是什么。

代码语言:javascript
复制
        [TestFixture(Category = "AppHost")]
    public class AppHostTests
        {
            /// <summary>
            /// The app host doesnt throw exception.
            /// </summary>
            [Test]
            public void AppHostDoesntThrowException()
                {
                    var apphost = new AppHost();
                    Assert.That(() => apphost.Init(),
                                Throws.Nothing);
                }
        }

无论我是使用NCRUNCH (设置为一次运行一个)还是使用resharpers,生成此错误的测试都会运行所有测试。生成此错误的通常是相同的测试,尽管这似乎有所不同。在所有情况下,如果我随后手动运行测试,它们都会通过。

EN

回答 1

Stack Overflow用户

发布于 2017-07-19 02:56:33

您只能初始化并同时运行一个AppHost,其中以某种方式正在运行NCrunch测试,而另一个AppHost仍在使用中。也许您可以尝试调试并设置断点,在尝试初始化另一个AppHost之前检查ServiceStackHost.Instance是否不为空。

注意: AppHostBase是一个ASP.NET Web应用程序,如果它运行在与单元测试相同的项目中,则可能会导致干扰。如果您想要一个集成测试,那么可以使用AppSelfHostBase代替BasicAppHost,这样您就可以运行一个完整的集成测试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45168725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档