【问题标题】:ServiceStack only GET-Requests are workingServiceStack 只有 GET-Requests 工作
【发布时间】:2018-07-04 12:23:10
【问题描述】:

我已经为这个问题苦苦挣扎了几个小时。我有一个 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!");
}

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

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.Execute(IRequest request, Object instance, Object requestDto, String requestName) 在 ServiceStack.Host.ServiceRequestExec 2.Execute(IRequest requestContext, Object instance, Object request) 在 ServiceStack.Host .ServiceController.ManagedServiceExec(ServiceExecFn serviceExec, IService service, IRequest request, Object requestDto) at ServiceStack.Host.ServiceController.c__DisplayClass37_0.b__0(IRequest req, Object dto) at ServiceStack.Host.ServiceController.ExecuteAsync(Object requestDto, IRequest req ) 在 ServiceStack.Host.RestHandler.ProcessRequestAsync(IRequest req, IResponse httpRes, String operationName)

【问题讨论】:

  • 你是如何测试的?什么客户端代码?当你说“不工作”时,那是怎么回事?你有错误吗?电脑会不会死机?电脑会厌恶地走开吗?盖世太保会来抢你的电脑吗?

标签: servicestack


【解决方案1】:

这个例外:

NotImplementedException:找不到名为 Get(TestRequest) 的方法 或 Service LogService 上的 Any(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 动词,您就可以使用具有相同路由的不同请求 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)

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2017-08-22
    • 2020-04-14
    相关资源
    最近更新 更多