ServiceStack 3.9.17.0实现IAsyncService

时间:2015-03-06 16:42:55

标签: c# servicestack servicestack-bsd

我正在尝试使用ServiceStack 3.9.17.0实现IAsyncService接口。

以下是我的服务定义的代码:

public class TestService : IAsyncService<int>
{
    object IAsyncService<int>.ExecuteAsync(int request)
    {
        return "Yup that worked";
    }
}

以下是我的Global.asax.cs代码:

public class Global : System.Web.HttpApplication
{
    public class TestServiceAppHost : AppHostBase
    {
        public TestServiceAppHost() : base("Test Async Web Services", typeof(TestService).Assembly) { }

        public override void Configure(Funq.Container container)
        {
            Routes.Add<int>("/Test");   
        }
    }
}

当我运行并转到元数据页面时,我看到此项目中存在的其他两个服务,它们只是实现了IService(删除以保持样本清洁)但我的IAsyncService没有显示,如果我尝试点击它我收到以下消息:

<Int32Response xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="">
    <ResponseStatus>
        <ErrorCode>KeyNotFoundException</ErrorCode>
        <Message>The given key was not present in the dictionary.</Message>
        <StackTrace>
                at System.Collections.Generic.Dictionary`2.get_Item(TKey key) 
                at ServiceStack.WebHost.Endpoints.Utils.FilterAttributeCache.GetRequestFilterAttributes(Type requestDtoType) 
                at ServiceStack.WebHost.Endpoints.EndpointHost.ApplyRequestFilters(IHttpRequest httpReq, IHttpResponse httpRes, Object requestDto) 
                at ServiceStack.WebHost.Endpoints.RestHandler.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, String operationName)
         </StackTrace>
    </ResponseStatus>
</Int32Response>

非常感谢任何和所有帮助。

修改

我在mythz的建议后更新代码看起来像这样(再次感谢回复)。

DTO和服务:

[Route("/test")]
public class TestDTO
{
    public int request { get; set; }
}

public class TestService : IAsyncService<TestDTO>
{
    object IAsyncService<TestDTO>.ExecuteAsync(TestDTO request)
    {
        return "Yup that worked";
    }
}

我将Global.asax.cs保持不变,只是我改变了使用DTO的路线,并使路线小写与DTO上的属性相匹配。我仍然有同样的问题。

编辑#2: 我升级到v3.9.71并且仍然遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

ServiceStack Services需要Request DTO,即具体的POCO类。您不能将int用作请求DTO。如果需要,可以将其包装在POCO类中,例如:

[Route("/test")]
public class Request 
{
    public int Int { get; set; }
}