我为我的服务设置了两条路线:
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:
可能我设法解决了这个问题。我在网址中预先发布了/json/reply
。
http://localhost/service/json/reply/foo/NameValueHere <- not working
http://localhost/service/foo/NameValueHere <- working
我认为内容类型和回复类型令牌都是强制性的。