我已经为这个问题苦苦挣扎了几个小时。我有一个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)
答案 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 /test
和POST /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)