2017-05-28 3 views
1

In letzter Zeit habe ich versucht, die Metadatenseite als Teil unserer Bemühungen zu nutzen, unsere Dokumentation reaktionsfähiger zu machen. Ich fand, dass ApiMember irgendwie nicht mit Projekten funktioniert, die dotnet core verwenden.Wie funktioniert ApiMember bei der Arbeit mit dem Dotnet-Core?

Das ist mein DTO ist, aktualisiert, um den vollständigen Inhalt der dto Definition umfasst

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(); 
    } 
} 

Und ich erwarte, dass der Name und Beschreibung sollten in der Metadaten Seite auftauchen, ist es nicht. Was soll ich machen?

Und wenn ich eine zweite Frage stellen kann, da ich die volle dto habe, muss ich fragen, der Validator (unter Verwendung von Fluentvalidation lib) funktioniert, aber, wie schalte ich es an den Logger? Zum Beispiel, wenn die Eingabe leer ist, möchte ich, dass der Logger diese Information behält, was soll ich tun?

metadata page screenshot

Update: ging ich zu meinem Code zurück, und ich fand, dass, wenn ich meine DTO Testrequest ändern es funktioniert. Insbesondere funktioniert das Folgende.

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; } 
} 
} 

und dies nicht

[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

Bitte fügen Sie die vollständige Klassendefinition von TestRequest unmodified – mythz

+0

@mythz aktualisiert, jetzt hat es vollständige Definition. Ich habe auch eine andere Frage darüber gestellt, wie man Fluentvalidation-Ergebnisse zum Logger – shawhu

+0

exportiert. Ich habe gerade ein Beispiel-.NET-Core-Projekt erstellt, das wie erwartet funktioniert, also müssen Sie auf die neueste Version upgraden, wenn Sie es nicht schon getan haben. Wenn es noch ein Problem gibt, veröffentlichen Sie ein eigenständiges überprüfbares Beispiel auf GitHub und ich werde es überprüfen. Bitte öffnen Sie neue Fragen, um unverbindliche Fragen zu stellen, aber Sie können den 'ValidationFeature.ErrorResponseFilter'-Hook verwenden, um Fehlerantwort-DTOs abzufangen und anzupassen. – mythz

Antwort

0

Ich habe gerade NetCoreApps/scratch Projekt erstellt Ihr TestRequest Dienst zu testen:

[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(); 
} 

Welche wie erwartet funktioniert die neueste v1.0.41 mit von .NET Core auf NuGet:

enter image description here

Sie müssen also ein Upgrade durchführen, wenn Sie nicht die neueste Version von .NET Core verwenden.

+0

nachdem ich versucht habe, was funktioniert, ging ich zurück zu meinem Code und ich fand schließlich den Unterschied. Nicht wegen meiner dotnet-Core-Version, sondern eher seltsam. Es scheint, dass die DTO-Klasse im selben Namensraum sein sollte wie service.cs. Ich habe meine Frage aktualisiert. – shawhu

+0

Ich denke, wenn dto-Klasse wegen der Inkonsistenz falsch ist (im gleichen Namespace mit service.cs oder nicht) und es funktioniert nicht, dann kann ich verstehen. Problem ist, dass es in allen anderen Bereichen außer dem genannten Verhalten funktioniert. – shawhu

+0

@shawhu Ich habe [die DTOs in einen anderen Namespace verschoben] (https://github.com/NetCoreApps/scratch/commit/928b8b0e1c8860c2fc78bf2844624c1e59b4c0ff) und es funktioniert immer noch wie erwartet, wenn das Problem ist, weil Sie vergessen haben, einen Namespace zu setzen füge einfach einen hinzu. – mythz

Verwandte Themen