2017-05-28 37 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

相關問題