仅ServiceStack GET请求正在运行

时间:2018-07-04 12:23:11

标签: servicestack

我已经为这个问题苦苦挣扎了几个小时。我有一个ServiceStack服务,只有GET-Requests在起作用。

这些是我的路线

[Route("/test", "POST")]
public class TestRequest : IReturnVoid { }

[Route("/test2", "GET")]
public class TestRequest2 : IReturnVoid { }

我的服务:

public void Post(TestRequest request)
{
    Console.WriteLine("Doesnt Work!");
}

public void Get(TestRequest2 request)
{
    Console.WriteLine("Works!");
}

非常简单。我没有配置任何RequestFilter。这是我的Configure方法:

public AppHost() : base(nameof(LogService), typeof(ServiceInterface.Services.LogService).Assembly) { }

public override void Configure(Container container)
{
    //container.Register(c => new LoggingService()).ReusedWithin(ReuseScope.Container);
    container.Register<IUserAuthRepository>(c => new LogUserAuthRepository());
    container.Register<ICacheClient>(new MemoryCacheClient());

    InitLogContext();

    //Add Plugins
    var authFeature = new AuthFeature
    (
        () => new AuthUserSession(),
        new IAuthProvider[] 
        {
            new CredentialsAuthProvider()
        }
    )
    { IncludeAssignRoleServices = false };

    base.Plugins.Add(authFeature);
    base.Plugins.Add(new ServiceStack.ProtoBuf.ProtoBufFormat());

    //Disable Cookies
    SetConfig(new HostConfig
    {
        AllowSessionCookies = false
    });

    base.GlobalResponseFilters.Add((req, res, obj) =>
    {
        // Handle void responses -> http://stackoverflow.com/questions/25260549/how-to-return-http-204-response-on-successful-delete-with-servicestack
        if (obj == null && res.StatusCode == 200)
        {
            res.StatusCode = (int)HttpStatusCode.NoContent;
            res.StatusDescription = "No Content";
        }
    });
}

很抱歉,我无法提供更多信息。我已经使我的整个代码尽可能简单。在同一程序集中创建另一个服务无法锻炼->结果相同。

有人知道为什么会发生这种情况以及我如何解决该问题?谢谢$

编辑:使用此方法:

[Route("/test")]
public class TestRequest : IReturnVoid, IPost { }

代替上面的代码给了我以下异常:

  

NotImplementedException:在Service LogService上找不到名为Get(TestRequest)或Any(TestRequest)的方法

     

StackTrace:在ServiceStack.Host.ServiceExec处1.在ServiceStack.Host.ServiceRequestExec处执行(IRequest请求,对象实例,对象requestDto,字符串requestName)在ServiceStack.Host处2.Execute(IRequest requestContext,对象实例,对象请求) .ServiceController.ManagedServiceExec(ServiceExecFn serviceExec,IService服务,IRequest请求,对象requestDto)在ServiceStack.Host.ServiceController。<> c__DisplayClass37_0.b__0(IRequest req,Object dto)在ServiceStack.Host.ServiceController.ExecuteAsync(Object requestDto,IRequest req) )在ServiceStack.Host.RestHandler.ProcessRequestAsync(IRequest req,IResponse httpRes,String operationName)

1 个答案:

答案 0 :(得分:1)

此例外:

  

NotImplementedException:找不到名为Get(TestRequest)的方法   或服务LogService上的任何(TestRequest)

是因为您尝试使用GET请求来调用TestRequest服务,而您只为以下内容声明了 Post 实现:

public void Post(TestRequest request)
{
    Console.WriteLine("Doesnt Work!");
}

您只能使用 GET 请求来调用TestRequest2服务:

public void Get(TestRequest2 request)
{
    Console.WriteLine("Works!");
}

仅在以下位置可用:

[Route("/test2", "GET")]
public class TestRequest2 : IReturnVoid { }

尽管GET请求应该返回某些内容,因为HTTP GET请求应该返回
"safe" and idempotent

无论如何,您似乎都希望对相同的路由使用相同的请求DTO,在这种情况下,您想对要支持的每个HTTP方法使用相同的请求DTO,例如:

[Route("/test")]
public class TestRequest : IReturn<string> { }

服务实施:

public string Post(TestRequest request) => "POST!";

public string Get(TestRequest request) => "GET!";

您可以同时使用GET /testPOST /test HTTP请求进行调用。

否则,只要指定路由应匹配的HTTP Verb,就可以对同一路由使用不同的请求DTO:

[Route("/test", "POST")]
public class PostRequest : IReturnVoid { }

[Route("/test", "GET")]
public class GetRequest : IReturn<string> { }

并让服务实施其各自的请求DTO:

public void Post(PostRequest request) => Console.WriteLine("POST!");

public string Get(GetRequest request) => "GET!";

这将使您使用相同的路线呼叫不同的服务:

GET  /test => Get(GetRequest)
POST /test => Post(PostRequest)