Hw将参数传递给我自己的Startup类?

Zac*_*ach 48 c# owin

我正在尝试使用OWIN开发一个web api自托管应用程序.在我自己的XyzStartup类中,我需要一个外部参数:contentFolderPath.

但是,我没有找到通过这个论点的方法.这是我的代码如下:

var contentFolderPath = this.TextBox.Text; // user input

var startOptions = new StartOptions();
using(WebApp.Start<XyzStartup>(startOptions)){

}
Run Code Online (Sandbox Code Playgroud)

我的创业公司

public class XyzStartup
{
     XyzStartup(string contentFolderPath) {  ...  }
}
Run Code Online (Sandbox Code Playgroud)

我注意到有一个StartOption类,但不知道如何使用它.我可以在XyzStartup类中使用它吗?

提前致谢!


我终于找到了这样做的方法:

var startOptions = new StartOptions();
startOptions.Urls.Add('..some url ..');

WebApp.Start(startOptions, (appBuilder)=>{
    new XyzStartup(contentFolderPath).Configuration(appBuilder);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 26

如果要将参数传递给StartUp类,可以Action<IAppBuilder>在注释中提到的CilliéMalan等WebApp.Start中使用,而不是使用Type参数(WebApp.Start<T>)启动

以下是自托管的具体示例:

object someThingYouWantToAccess;
var server = WebApp.Start("http://localhost:8080/", (appBuilder) =>
{
    // You can access someThingYouWantToAccess here

    // Configure Web API for self-host.
    HttpConfiguration config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    appBuilder.UseWebApi(config);
});
Run Code Online (Sandbox Code Playgroud)


Cil*_*lan 5

据我所知,尽管之前可能已经存在过,但是无法将参数传递给启动类.

但是,当自托管时,我注意到启动类是在调用的同一个线程中创建的WebApp.Start.考虑到这一点,我使用一个ThreadStatic字段将信息传递给启动类(在我的情况下,我想传递HttpConfiguration):

    public class Startup
    {
        private HttpConfiguration _configuration;

        [ThreadStatic]
        internal static HttpConfiguration _configurationHolder;

        public static HttpConfiguration CurrentConfiguration
        {
            get { return _configurationHolder; }
            set { _configurationHolder = value; }
        }

        public Startup()
        {
            //get the configuration which is held in a threadstatic variable
            _configuration = _configurationHolder;
        }

        public void Configuration(IAppBuilder appBuilder)
        {
            //do stuff
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我在其他地方有另一种启动自托管站点的方法:

    public void Start(StartOptions startupOptions, HttpConfiguration configuration)
    {
        Startup.CurrentConfiguration = configuration;
        _application = WebApp.Start<Startup>(startupOptions);
        Startup.CurrentConfiguration = null;
    }
Run Code Online (Sandbox Code Playgroud)

  • 另外,我只是注意到`WebApp.Start`有一个超载接受`Action <IAppBuilder>`,在这种情况下你可以捕获你可能需要的任何参数. (11认同)