github で提供されている例と、コードを自分で実行したい人のためのドロップ ボックス ダウンロード リンクを使用して、この質問を再質問しました。
Web サイト ソリューション内の '/api/ パスの下で servicestack JSON サービスを実行していましたが、そのサービス スタック部分を分割して、自己ホスト型 Windows サービスとして実行したいと考えています。私の問題は、私自身と他の開発者が Swagger プラグインがテスト目的で非常に便利であることを発見したことですが、自己ホストされているため、HTTPHandler はサービス ルートを処理するためだけに設定されているように見え、プレーンな HTML は機能しません。
これを修正するにはどうすればよいですか?
URL :http://localhost:8081/Swagger-UI/Index.html
応答 :
Handler for Request not found:
Request.HttpMethod: GET
Request.HttpMethod: GET
Request.PathInfo: /Swagger-UI/Index.html
Request.QueryString:
Request.RawUrl: /Swagger-UI/Index.html
Nuget パッケージがインストールされています:
ServiceStack
ServiceStack.Razor
@marfarma の更新
私のapp.configファイルには、ServiceStackに関連するものは何もありません...
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_service1_V2_SSL" />
<binding name="BasicHttpBinding_service2_V1_SSL" />
</basicHttpBinding>
</bindings>
<client>
<!-- bespoke services I'm connecting too -->
</client>
</system.serviceModel>
<appSettings>
<!-- bespoke app settings -->
</appSettings>
</configuration>
Program.cs :
AppHostHttpListenerBase appHost = new my.HttpApi.myApiServiceHostBase("My Service", "my.ApiService");
string listeningURL = "http://localhost:8081/";
var appSettings = new ServiceStack.Configuration.AppSettings();
my.HttpApi.FakeProvider.ProductProvider.Init(appSettings);
my.HttpApi.FakeProvider.UserProvider.Init(appSettings);
#if DEBUG
try
{
appHost.Init();
appHost.Start(listeningURL);
Console.WriteLine("Press <CTRL>+C to stop.");
Thread.Sleep(Timeout.Infinite);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: {0}: {1}", ex.GetType().Name, ex.Message);
throw;
}
finally
{
appHost.Stop();
}
Console.WriteLine("WinServiceAppHost has finished");
構成方法:
public override void Configure(Funq.Container container)
{
Plugins.RemoveAll(x => x is CsvFormat);
Plugins.RemoveAll(x => x is HtmlFormat);
ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;
//register any dependencies your services use, e.g:
//container.Register<ICacheClient>(new MemoryCacheClient());
var config = new EndpointHostConfig { DefaultContentType = ContentType.Json, ServiceStackHandlerFactoryPath = "api" };
SetConfig(config);
Plugins.Add(new ServiceStack.Api.Swagger.SwaggerFeature());
Dictionary<Type, string[]> serviceRoutes = new Dictionary<Type, string[]>();
serviceRoutes.Add(typeof(AuthService), new[] { "/auth/user" });
AuthFeature authFeature = new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new FakeCredentialsAuthProvider() });
authFeature.IncludeAssignRoleServices = false;
authFeature.ServiceRoutes = serviceRoutes; //specify manual auth routes
Plugins.Add(authFeature);
container.Register<ICacheClient>(new MemoryCacheClient());
var userRep = new InMemoryAuthRepository();
container.Register<IUserAuthRepository>(userRep);
Plugins.Add(new CorsFeature(allowedOrigins: "*",
allowedMethods: "GET, POST, OPTIONS",
//allowedHeaders: "Content-Type",
allowedHeaders : "Origin, X-Atmosphere-tracking-id, X-Atmosphere-Framework, X-Cache-Date, Content-Type, X-Atmosphere-Transport, *",
allowCredentials: false));
}
更新 2:
1.) html と csv を削除する上記のプラグイン セクションを削除しました
2.) パッケージ マネージャー (nuget) で次を実行します。
Install-Package ServiceStack.Api.Swagger
まだハンドラが見つかりません。
marfarma が指摘したこの質問 ( ServiceStack: No /swagger-ui/index.html ) のアドバイスは、「swagger-ui」html と javascript が存在しない可能性があることを示唆しています。私はそうします。
自己ホスト型サービス スタックは指定されたルートのみを「処理」しているようです。自己ホスト型サービスに Swagger html と JavaScript を配信するように依頼すると、上記の「リクエストのハンドラーが見つかりません」というエラーが表示されます。
自己ホスト型サービスで /resources アドレスにアクセスすると、予想されるページとデータが表示されます (swagger プラグインが適切に機能していることを示唆しています)。 ' 私のサービスによって)、機能するリソース URL を提供すると、「サーバーから読み取ることができません。適切なアクセス制御元の設定がない可能性があります。」というメッセージが表示されますが、これは CORS の問題のようですが、 「サービスでcorsを有効にしました(Swagger UIコードの問題のようです)、swagger-uiはセルフホストサービスに(GETまたはPOSTではなく)「OPTIONS」として送信されたリクエストを送信し、オプションリクエストは失敗します:(