2017-05-28 69 views
1

最近,我一直在尝试利用元数据页面来成为我们努力的一部分,以使我们的文档更具响应能力。我发现ApiMember似乎不能用于使用dotnet核心的项目。如何在使用dotnet核心时使ApiMember正常工作

这是我的DTO,更新,包括DTO定义

using ServiceStack; 

[Api("Test request")] 
[Route("/test/{Input}","GET")] 
[Route("/test")] 
public class TestRequest:IReturn<TestResponse> 
{ 
    [ApiMember(Name="Parameter name", Description = "Parameter Description", 
    ParameterType = "body", DataType = "string", IsRequired = true)] 
    public string Input { get; set; } 
} 
public class TestResponse 
{ 
    public string Output { get; set; } 
} 
//Validator 
public class TestRequestValidator : AbstractValidator<TestRequest> 
{ 
    public TestRequestValidator() 
    { 
     RuleFor(r => r.Input).NotEmpty(); 
    } 
} 

的全部内容,我期待的名称和说明应在元数据页面显示,事实并非如此。我该怎么办?

而且,如果我可能会问第2个问题,因为我有完整的dto,我必须要求验证器(使用fluentvalidation lib)确实有效,但是,如何将它连接到记录器?例如,当输入为空时,我希望记录器保存那条信息,我该怎么办?

metadata page screenshot

更新: 我回到了我的代码,我发现,如果我改变我的DTO Testrequest它的工作原理。具体来说,下面的作品。

namespace web 
{ 
[Api("Test request")] 
[Route("/test/{Input}", "GET")] 
[Route("/test")] 
public class TestRequest : IReturn<TestResponse> 
{ 
    [ApiMember(Name = "Parameter name", Description = "Parameter Description", 
    ParameterType = "body", DataType = "string", IsRequired = true)] 
    public string Input { get; set; } 
} 
public class TestResponse 
{ 
    public string Output { get; set; } 
} 
} 

这并不

[Api("Test request")] 
[Route("/test/{Input}", "GET")] 
[Route("/test")] 
public class TestRequest : IReturn<TestResponse> 
{ 
    [ApiMember(Name = "Parameter name", Description = "Parameter Description", 
    ParameterType = "body", DataType = "string", IsRequired = true)] 
    public string Input { get; set; } 
} 
public class TestResponse 
{ 
    public string Output { get; set; } 
} 
+0

请包括完整的类定义TestRequest未修改 – mythz

+0

@mythz更新,现在它有完整的定义。我还问过关于如何将fluentvalidation结果导出到日志记录器的另一个问题 – shawhu

+0

我刚刚创建了一个按预期工作的示例.NET Core项目,因此如果尚未完成,则需要升级到最新版本,如果仍有问题,请在GitHub上发布独立的可验证示例,我会检查一下。请打开新问题以询问无关的问题,但您可以使用'ValidationFeature.ErrorResponseFilter'钩子截取并自定义错误响应DTO。 – mythz

回答

0

我刚刚创建NetCoreApps/scratch项目来测试您的TestRequest服务:

[Api("Test request")] 
[Route("/test/{Input}", "GET")] 
[Route("/test")] 
public class TestRequest : IReturn<TestResponse> 
{ 
    [ApiMember(Name = "Parameter name", Description = "Parameter Description", 
     ParameterType = "body", DataType = "string", IsRequired = true)] 
    public string Input { get; set; } 
} 
public class TestResponse 
{ 
    public string Output { get; set; } 
} 

public class MyServices : Service 
{ 
    public object Any(TestRequest request) => new TestResponse(); 
} 

这是工作与使用最新v1.0.41预期NuGet上的.NET Core:

enter image description here

因此,如果您不使用最新版本的.NET Core,则需要升级。

+0

我尝试了你的工作后,我回到我的代码,我终于找到了差异。不是因为我的dotnet核心版本,而是很奇怪。看来DTO类应该和service.cs在同一个名字空间中。我更新了我的问题。 – shawhu

+0

我认为,如果由于不一致导致dto类不正确(在与service.cs相同的命名空间中)并且它不起作用,那么我可以理解。问题是在所有其他领域都有效,除了上述行为。 – shawhu

+0

@shawhu我已经[将DTO移动到不同的命名空间](https://github.com/NetCoreApps/scratch/commit/928b8b0e1c8860c2fc78bf2844624c1e59b4c0ff)并且它仍然按预期工作,如果问题是因为您忘记放置命名空间,只需添加一个。 – mythz

相关问题