我正在尝试向ServiceStack添加一项新服务,但它未被识别,我的路由未显示在元数据中。
这是我的服务:
public class EventService : Service
{
public object Post(EventRequest event_request)
{
return new EventResponse() {
name = "FirstEvent"
}
}
}
public class EventRequest
{
public int event_id { get; set; }
}
[Route("/event", "POST")]
public class EventResponse {
public string name { get; set; }
}
我甚至在AppHost中明确引用了EventService,即使它们在同一个程序集中。我只是在基本服务教程代码中添加了一个服务,我的服务定义在与HelloService相同的命名空间中。
public AppHost() //Tell ServiceStack the name and where to find your web services
: base("StarterTemplate ASP.NET Host", typeof(HelloService).Assembly, typeof(EventService).Assembly) { }
我也试过停止并启动IIS Express服务
我错过了什么?
答案 0 :(得分:2)
它不起作用,因为您已将[Route]
应用于错误的类。您需要在请求DTO上定义路由而不是响应DTO。所以你应该这样定义它:
[Route("/event", "POST")]
public class EventRequest : IReturn<EventResponse>
{
public int event_id { get; set; }
}
您的操作方法也应该定义返回类型,而不是键入object
:
public class EventService : Service
{
public EventResponse Post(EventRequest event_request)
{
return new EventResponse() {
name = "FirstEvent"
}
}
}
您现在没有定义元数据,因为没有方法将您的响应EventResponse
用作请求DTO。所以只是导致你的问题的一个非常小的事情。
bin
中的旧服务程序集:从SecondWbService.dll
中删除bin
。这是一个正在加载的旧服务而不是MainWebService.dll
- 您正在编辑并想要运行的服务。由于ServiceStack不允许多个AppHost,因此WebActivator会查找较旧的DLL并首先运行它,因此您的服务将被隐藏。删除该DLL后,重新运行该解决方案,应该正确选择它。您可以通过添加断点来确认:
public AppHost() //Tell ServiceStack the name and where to find your web services
: base("StarterTemplate ASP.NET Host", typeof(HelloService).Assembly, typeof(EventService).Assembly)
{ // BREAKPOINT HERE, confirm the assembly is loaded
}
元数据和服务应该可以正常工作。