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);
}
パラメータをStartUpクラスに渡したい場合は、Typeパラメータで起動する代わりに、コメントで言及されているCilliéMalanのようにWebApp.StartでAction<IAppBuilder>
を使用できます(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);
});
私の知る限り、以前は可能だったかもしれませんが、スタートアップクラスにパラメーターを渡すことはできません。
ただし、セルフホスティングを行っているときに、スタートアップクラスが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;
}