我正在尝试使用OWIN开发一个web api自托管应用。 在我自己的XyzStartup类中,我需要一个外部参数:contentFolderPath。
但是,我没有找到通过这个论点的方法。以下是我的代码:
var contentFolderPath = this.TextBox.Text; // user input
var startOptions = new StartOptions();
using(WebApp.Start<XyzStartup>(startOptions)){
}
我的创业
public class XyzStartup
{
XyzStartup(string contentFolderPath) { ... }
}
我注意到有一个StartOption类,但不知道如何使用它。我可以在我的XyzStartup类中使用它吗?
提前致谢!
我终于找到了办法:
var startOptions = new StartOptions();
startOptions.Urls.Add('..some url ..');
WebApp.Start(startOptions, (appBuilder)=>{
new XyzStartup(contentFolderPath).Configuration(appBuilder);
}
答案 0 :(得分:23)
如果要将参数传递给StartUp类,可以在WebApp.Start中使用Action<IAppBuilder>
,如注释中提到的CilliéMalan,而不是使用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);
});
答案 1 :(得分: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
}
}
然后在其他地方,我有另一种启动自托管站点的方法:
public void Start(StartOptions startupOptions, HttpConfiguration configuration)
{
Startup.CurrentConfiguration = configuration;
_application = WebApp.Start<Startup>(startupOptions);
Startup.CurrentConfiguration = null;
}