向ServiceStack添加服务

时间:2014-03-03 11:47:34

标签: c# web-services rest servicestack

我正在尝试向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服务

我错过了什么?

1 个答案:

答案 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 
}

元数据和服务应该可以正常工作。