サービス用に 2 つのルートをセットアップします。
GET /foo
GET /foo/{Name}
メタデータ ページには、次のものが正しくリストされています。
GET /foo
GET /foo/{Name}
しかし、ブラウズする/baseurl/foo/NameValueHere
と
The operation 'NameValueHere' does not exist for this service
(自己ホスト型) apphost で構成が不足していますか?
編集:
追加情報
私は自分の DTO より Route 属性が気に入らなかったので、 の簡単な拡張メソッドを書きましたIServiceRoutes
。
public static IServiceRoutes AddFromServiceAttributes(this IServiceRoutes routes)
{
var myServiceTypes = typeof(MyServiceBase).Assembly.GetDerivedTypesOf<MyServiceBase>();
var routedMethods = myServiceTypes.SelectMany(type => type.GetMethodsWithAttribute<MyServiceRouteAttribute>());
foreach (var routedMethod in routedMethods)
{
var routesFound = routedMethod.GetAttributes<MyServiceRouteAttribute>();
foreach (var route in routesFound)
{
// request type can be inferred from the method's first param
// and the same for allowed verbs from the method's name
// [MyServiceRoute(typeof(ReqType), "/foo/{Name}", "GET")]
// [MyServiceRoute("/foo/{Name}", "GET")]
// [MyServiceRoute(typeof(ReqType), "/foo/{Name}")]
if (route.RequestType == null)
{
route.RequestType = routedMethod.GetParameterListFromCache().First().ParameterType;
}
if (string.IsNullOrWhiteSpace(route.Verbs))
{
var upperRoutedMethodName = routedMethod.Name.ToUpperInvariant();
route.Verbs = upperRoutedMethodName != "ANY" ? upperRoutedMethodName : null;
}
routes.Add(route.RequestType, route.RestPath, route.Verbs);
}
}
return routes;
}
このメソッドを で呼び出しAppHost.Configure
ますAddFromAssembly
。
this.SetConfig(new EndpointHostConfig { ServiceStackHandlerFactoryPath = "service" });
// some container registrations here
this.Routes.AddFromServiceAttributes().AddFromAssembly();
私が困惑しているのは、メタデータ ページにルートが正しく表示されていることです。
DTO は非常に単純で、Name
文字列プロパティが含まれています。
class Foo { public string Name { get; set; } }
編集 2:MyServiceRouteAttribute
属性を削除し、ServiceStack の を再利用しましたRouteAttribute
。リクエスト DTO タイプは、最初のメソッド パラメータから推測されます。
編集3:おそらく私はこれを解決することができました。URLにプリプレディング/json/reply
していました。
http://localhost/service/json/reply/foo/NameValueHere <- not working
http://localhost/service/foo/NameValueHere <- working
content-type トークンと reply-type トークンの両方が必須だと思いました。